窗口管理器 - 仅在 Android 6 上出现错误令牌异常



我有一个扩展服务的类。

public class CustomService extends Service {
  private ImageView chatHead;
  private WindowManager.LayoutParams params ;
  private ImageView iv;
  @Override
  public void onCreate() {
    super.onCreate();
    iv = new ImageView(this);
    bitmap = BitmapFactory.decodeResource(getResources(), ...);
    bitmap = Bitmap.createScaledBitmap(...);
    iv.setImageBitmap(bitmap);
    //INITIALIZE FROM SCREEN DIMENSIONS
    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    //PARAMETERS
    params= new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.TOP | Gravity.LEFT;
    params.x = 0;
    params.y = mHeight - chatHeadRadius ;
    windowManager.addView(iv, params); // HERE WE HAVE THE CRASH
  }
}

我以这种方式从我的主活动创建服务:

        startService(new Intent(getApplication(), MyService.class));

此代码在装有Android 4和5的设备上非常有效。但是当我尝试在棉花糖上运行它时,我得到了崩溃。

我必须通知您,我已经尝试过将权限放在

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

在我的清单文件中,但它没有解决问题。

有什么想法吗?

我终于找到了这个问题的解决方案(在同事的帮助下:)

所以,所有的工作都在我的主活动中启动服务之前完成。我必须检查用户是否启用了Settings.ACTION_MANAGE_OVERLAY_PERMISSION。如果用户未启用该权限,我将启动"设置"活动,以便用户自己启用该权限。

public void checkDrawPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, 123);
        } else {
            // display over lay from service
            startService(new Intent(getApplicationContext(), MyService.class));
        }
    }else
    {
        // display over lay from service
        startService(new Intent(getApplicationContext(), MyService.class));
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode,resultCode,data);
    if (requestCode == 123) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (Settings.canDrawOverlays(this)) {
                // You have permission
                // display over lay from service
                startService(new Intent(getApplicationContext(), MyService.class));
            }
        }
    }
}

最新更新