Settings.ACTION_MANAGE_OVERLAY_PERMISSION 权限不适用于 api 级别 23 以上的所有设备

Har*_*han 5 android android-permissions

我正在测试我的应用程序在(Coolpad(Lolipop MRI)、Samsung Galaxy grand neo(Kitkat)、Redmi(Marshmallow)、Lenovo z2 plus(Marshmallow))等设备上的动作叠加,以在来电屏幕上显示对话。事情似乎适用于 lenovo z2 plus() 以外的设备。

正式直接请求许可我得到了例外:

   public void testPermission() {
    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, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
          }
    }
}
Run Code Online (Sandbox Code Playgroud)

android.content.ActivityNotFoundException: 没有找到处理 Intent { act=android.settings.action.MANAGE_OVERLAY_PERMISSION 的活动

现在我将请求许可更改为:

 public void testPermission() {
    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()));
            if (intent.resolveActivity(getPackageManager()) != null) {
                startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但它仍然无法在 zuk 2 中请求许可。感谢立即提供帮助。

Kir*_*iya 7

ACTIVITY_MANAGE_OVERLAY_PERMISSION在加入API等级23。在发送意图之前,您需要检查匹配的活动是否可用。文档中明确指出,

文档在某些情况下,匹配的 Activity 可能不存在,因此请确保您对此加以防范。

在 manifest.xml 中为 SYSTEM_ALERT_WINDOW 定义权限,

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Run Code Online (Sandbox Code Playgroud)

意图

    public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE= 2323;

    public void checkPermission() {
        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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

而Result方法,Intent不会向该onActivityResult方法返回任何数据。最好在onActivityResult方法中再次检查覆盖权限

@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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:如果应用面向 API 级别 23 或更高级别,应用用户必须通过权限管理屏幕向应用明确授予此权限。该应用程序通过发送带有操作 Settings.ACTION_MANAGE_OVERLAY_PERMISSION 的意图来请求用户的批准。应用程序可以通过调用 Settings.canDrawOverlays() 来检查它是否具有此授权。


Ult*_*vil -2

尝试这个

它对我有用

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.canDrawOverlays(this)) {
                Intent localIntent = new Intent("android.settings.action.MANAGE_OVERLAY_PERMISSION");
                localIntent.setData(Uri.parse("package:" + getPackageName()));
                localIntent.setFlags(268435456);
                startActivity(localIntent);
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用:异常:android.content.ActivityNotFoundException:找不到处理意图的活动{act = android.settings.action.MANAGE_OVERLAY_PERMISSION (3认同)