如何在 Android 中以编程方式授予 设置 -> 应用程序 -> 在其他应用程序上方绘制
权限?我想使用系统警报窗口,但在 Android Marshmallow 中无法使用,除非强制用户首先通过设置应用程序来授予权限。
如何在 Android 中以编程方式授予 设置 -> 应用程序 -> 在其他应用程序上方绘制
权限?我想使用系统警报窗口,但在 Android Marshmallow 中无法使用,除非强制用户首先通过设置应用程序来授予权限。
您可以使用此功能检查并请求覆盖其他应用程序的绘制权限
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 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"/>
以下是自动授予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项目中进行了测试,成功地授予“在其他应用程序上方绘制”权限给Headwind Remote应用程序(免责声明:我是Headwind MDM和Headwind Remote的项目所有者),当Headwind MDM应用程序使用平台密钥签名时。该代码已经在Android 10(LineageOS 17)上进行了测试。
请查看这个问题和答案:
SYSTEM_ALERT_WINDOW - 如何在Android 6.0及targetSdkVersion 23上自动获取此权限
“每个请求SYSTEM_ALERT_WINDOW权限并通过Play商店安装(需要版本6.0.5或更高版本)的应用程序将自动授予该权限。”