如何以编程方式在Android中Settings -> Apps -> Draw over other apps
授予权限?我想使用系统警报窗口,但无法在Android Marshmallow中强制用户通过“设置”应用并首先授予权限。
答案 0 :(得分:15)
您可以使用此
检查并要求覆盖权限以覆盖其他应用if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 0);
}
答案 1 :(得分:0)
答案 2 :(得分:0)
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 0);
}
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission>
答案 3 :(得分:0)
这是自动授予包的 SYSTEM_ALERT_WINDOW 权限的代码。要运行此代码,您的 Android 应用程序必须是系统的(由平台密钥签名)。
此方法基于以下 Android 源代码文件:AppOpsManager.java 和 DrawOverlayDetails.java,请参阅方法 DrawOverlayDetails.setCanDrawOverlay(boolean newState)
。
@TargetApi(Build.VERSION_CODES.KITKAT)
public static void autoSetOverlayPermission(Context context, String packageName) {
PackageManager packageManager = context.getPackageManager();
int uid = 0;
try {
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);
uid = applicationInfo.uid;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return;
}
AppOpsManager appOpsManager = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
final int OP_SYSTEM_ALERT_WINDOW = 24;
try {
Class clazz = AppOpsManager.class;
Method method = clazz.getDeclaredMethod("setMode", int.class, int.class, String.class, int.class);
method.invoke(appOpsManager, OP_SYSTEM_ALERT_WINDOW, uid, packageName, AppOpsManager.MODE_ALLOWED);
Log.d(Const.LOG_TAG, "Overlay permission granted to " + packageName);
} catch (Exception e) {
Log.e(Const.LOG_TAG, Log.getStackTraceString(e));
}
}
}
该代码已在 Headwind MDM 项目中进行测试,它成功授予了“绘制其他应用程序”权限,而无需任何用户同意 aPuppet remote access 应用程序(免责声明:我是 Headwind MDM 的项目所有者和 aPuppet),当 Headwind MDM 应用程序由平台密钥签名时。代码已在 Android 10 (LineageOS 17) 上进行测试。