Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 没有处理操作\u管理\u覆盖\u权限的活动_Android_Android 6.0 Marshmallow - Fatal编程技术网

Android 没有处理操作\u管理\u覆盖\u权限的活动

Android 没有处理操作\u管理\u覆盖\u权限的活动,android,android-6.0-marshmallow,Android,Android 6.0 Marshmallow,我正在开发一个需要SYSTEM\u ALERT\u窗口权限的应用程序。在Android 6.0+上,我使用设置创建了一个意图。ACTION\u MANAGE\u OVERLAY\u PERMISSION请求用户向应用程序授予权限 根据,当我出于此目的调用startActivityForResult时,可能找不到活动来处理此目的 在某些情况下,匹配的活动可能不存在,因此请确保 防止这种情况 哪些情况下可能没有匹配的活动?在这种情况下我该怎么办 在哪些情况下可能没有匹配的活动 制造商可能已经从设置应

我正在开发一个需要
SYSTEM\u ALERT\u窗口
权限的应用程序。在Android 6.0+上,我使用
设置创建了一个意图。ACTION\u MANAGE\u OVERLAY\u PERMISSION
请求用户向应用程序授予权限

根据,当我出于此目的调用
startActivityForResult
时,可能找不到
活动
来处理此目的

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

哪些情况下可能没有匹配的
活动
?在这种情况下我该怎么办

在哪些情况下可能没有匹配的活动

制造商可能已经从设置应用程序中删除了相关的
,或者以其他方式重新组织了该应用程序,使得没有直接的
意图进入该屏幕

在这种情况下我该怎么办

向用户解释您不能将他们带到该屏幕

在哪些情况下可能没有匹配的活动

制造商可能已经从设置应用程序中删除了相关的
,或者以其他方式重新组织了该应用程序,使得没有直接的
意图进入该屏幕

在这种情况下我该怎么办


向用户解释您不能将他们带到该屏幕。

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

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

}
public boolean candrawOverlayView(){
if(Build.VERSION.SDK\u INT
您可以使用下面的代码将用户带到权限屏幕,并让他们手动授予权限。通过使用反射,我们可以进一步尝试

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

}
public boolean candrawOverlayView(){
if(Build.VERSION.SDK\u INT
谢谢您的回答。问题是,我正在开发一个特殊的应用程序,用于特定的设备,不面向公众,我需要检查用户是否正在与设备交互,以延迟启动我的活动,直到用户停止使用设备,因此我覆盖屏幕并记录最后一次触摸的时间。在关闭的情况下,我不能覆盖,那么用户将不断中断我的活动,这当然是不可接受的。你对这种情况有什么建议吗?有什么解决办法吗?@MohanadMohie:在将硬件移交给用户之前,手动翻转设置。如果他们手动进入并破坏此设置,那是他们自己的错误。或者,在此设备上安装您自己的自定义ROM,您已将此设置锁定到所需的状态。自定义ROM的想法实际上是一个好主意,它是由我的一位同事提出的,但我不确定它是否可以在我们的情况下实现。再次感谢您的回答和跟进,我为延迟回复而道歉。谢谢您的回答。问题是,我正在开发一个特殊的应用程序,用于特定的设备,不面向公众,我需要检查用户是否正在与设备交互,以延迟启动我的活动,直到用户停止使用设备,因此我覆盖屏幕并记录最后一次触摸的时间。在关闭的情况下,我不能覆盖,那么用户将不断中断我的活动,这当然是不可接受的。你对这种情况有什么建议吗?有什么解决办法吗?@MohanadMohie:在将硬件移交给用户之前,手动翻转设置。如果他们手动进入并破坏此设置,那是他们自己的错误。或者,安装y