在 Marshmallow 之后,Android 加强了安全级别。但是对于
SYSTEM_ALERT_WINDOW
,您可以显示浮动操作和任何内容。您可以通过在
onCreate()
方法中遵循以下代码来强制用户授权:
将此代码放置在 setContentView 之后:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(myIntent);
}
动作
ACTION_MANAGE_OVERLAY_PERMISSION
直接启动“绘制其他应用程序”权限屏幕。
编辑:
我的上面的代码完全正确
但是我发现很多人仍在搜索如何永久允许
ACTION_MANAGE_OVERLAY_PERMISSION
,比如如果用户一旦允许了权限,就不会每次打开应用程序时都询问他。所以这里有一个解决方案:
检查设备是否具有API 23+
如果是23+ API,则检查用户是否拥有许可证
如果已经允许,请不要将其驱动到Settings.ACTION_MANAGE_OVERLAY_PERMISSION
,如果还没有允许,请进行运行时权限检查
将下面一行放入您的
onCreate()
方法中。 将此放置在
setContentView
之后:
checkPermission()
现在将以下代码放入
onActivityResult
中:
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
if (!Settings.canDrawOverlays(this)) {
checkPermission();
} else {
}
}
}
现在最后是checkPermission方法的代码:
public void checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
}
}
}
也不要忘记在你的类中声明这个公共变量:
public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;