没有处理ACTION_MANAGE_OVERLAY_PERMISSION的活动

时间:2016-12-19 12:31:54

标签: android android-6.0-marshmallow

我正在开发一个需要SYSTEM_ALERT_WINDOW权限的应用程序。在Android 6.0及更高版本中,我使用Settings.ACTION_MANAGE_OVERLAY_PERMISSION创建了一个intent,要求用户授予应用程序权限。

根据the documentation,当我以此意图致电startActivityForResult时,我可能无法找到Activity来处理意图。

  

在某些情况下,匹配的活动可能不存在,因此请确保您   防止这种情况发生。

可能没有匹配Activity的情况是什么?在那种情况下我该怎么做?

2 个答案:

答案 0 :(得分:1)

  

可能没有匹配活动的情况是什么?

制造商可能已从“设置”应用中移除了关联的<intent-filter>,或者重新组织了该应用,以便没有直接Intent进入该屏幕。

  

在这种情况下该怎么做?

向用户解释您无法将他们带到该屏幕。

答案 1 :(得分:-1)

您可以使用以下代码将用户带到权限屏幕,并让他们手动授予权限。通过使用反射,我们可以尝试。

public boolean canDrawOverlayViews () {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        return true;
    }
    try {
        return Settings.canDrawOverlays (this);
    } catch (NoSuchMethodError e) {
        e.printStackTrace ();
        return canDrawOverlaysUsingReflection (this);
    }

}

public boolean canDrawOverlaysUsingReflection (Context context) {

    try {
        AppOpsManager manager = (AppOpsManager) context.getSystemService (Context.APP_OPS_SERVICE);
        Class clazz = AppOpsManager.class;
        Method dispatchMethod = clazz.getMethod ("checkOp",
                new Class[]{int.class, int.class, String.class});
        //AppOpsManager.OP_SYSTEM_ALERT_WINDOW = 24
        int mode = (Integer) dispatchMethod.invoke (manager,
                new Object[]{24, Binder.getCallingUid (),
                        context.getApplicationContext ().getPackageName ()});
      /* int modee = manager.checkOp(AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW,
                Binder.getCallingUid(), context.getPackageName());

      */
        //Log.e ("mode", mode + "");

        return AppOpsManager.MODE_ALLOWED == mode;


    } catch (Exception e) {
        e.printStackTrace ();
        return false;
    }

}