Android系统覆盖窗口

我正在尝试创建一个系统覆盖。 但我一直得到“许可被拒绝”。 我正在使用SDK版本23。

我的清单文件:

            

我用来创建叠加层的代码:

  //mView = new HUDView(this); mButton = new Button(this); mButton.setText("Overlay button"); mButton.setOnTouchListener(this); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); params.gravity = Gravity.RIGHT | Gravity.TOP; params.setTitle("Load Average"); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.addView(mButton, params); 

Related of "Android系统覆盖窗口"

首先,没有名为SYSTEM_OVERLAY_WINDOW权限。 它是SYSTEM_ALERT_WINDOW

其次,如果您的targetSdkVersion为23或更高,并且您在Android 6.0及更高版本的设备上运行,则您的应用在开始时将无法获得此权限。 调用Settings.canDrawOverlays()以查看您是否拥有该权限,如果不这样做,请使用ACTION_MANAGE_OVERLAY_PERMISSION将用户引导至“设置”。

在AndroidManifest中(版本<23)

  public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE= 5469; //Random value public void testPermission() { if (!Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE); } } 

结果:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) { if (Settings.canDrawOverlays(this)) { // You have permission } } } 

您还可以将用户引导至特定应用的覆盖页面。 文件说明 :

输入:可选地,Intent的数据URI可以指定应用程序包名称以直接调用特定于包名称的管理GUI。 例如“package:com.my.app”。

所以类似于:

 intent.setData(Uri.fromParts("package", getPackageName(), null)); 

作为替代解决方案,您可以尝试使用WindowManager.LayoutParams.TYPE_TOAST而不是WindowManager.LayoutParams.TYPE_SYSTEM_ALERT。 这不需要任何许可。 我用它来显示图像,也许按钮会起作用