【问题标题】:WindowManager-Bad token exception only on Android 6WindowManager-Bad token 异常仅适用于 Android 6
【发布时间】:2016-02-24 13:25:09
【问题描述】:

我有一个扩展 Service 的类。

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
  }
}

我以这种方式从我的 mainActivity 创建服务:

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

这段代码在运行 Android 4 和 5 的设备上运行良好。但是当我尝试在 Marshmallow 上运行它时,我遇到了崩溃。

我必须通知你,我已经尝试过授权

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

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

有什么想法吗?

【问题讨论】:

    标签: java android-service android-6.0-marshmallow


    【解决方案1】:

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

    所以,在我的 MainActivity 中启动服务之前,所有工作都已完成。 我必须检查用户是否启用了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));
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 2019-12-28
      • 2013-08-07
      相关资源
      最近更新 更多