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