我正在开发一个需要SYSTEM_ALERT_WINDOW
权限的应用程序。在Android 6.0及更高版本中,我使用Settings.ACTION_MANAGE_OVERLAY_PERMISSION
创建了一个intent,要求用户授予应用程序权限。
根据the documentation,当我以此意图致电startActivityForResult
时,我可能无法找到Activity
来处理意图。
在某些情况下,匹配的活动可能不存在,因此请确保您 防止这种情况发生。
可能没有匹配Activity
的情况是什么?在那种情况下我该怎么做?
答案 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;
}
}