是的,在 Marshmallow 之后,Android 使安全级别更加稳定,但对于
SYSTEM_ALERT_WINDOW
您可以显示浮动操作和任何内容您可以通过在 onCreate() 方法中遵循代码来强制用户授予权限
将此代码放在 setContentView 之后
// Check if Android M or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Show alert dialog to the user saying a separate permission is needed
// Launch the settings activity if the user prefers
Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(myIntent);
}
ACTION_MANAGE_OVERLAY_PERMISSION 操作直接启动“在其他应用上绘制”权限屏幕。
编辑:
我上面的代码 100% 正确
但我刚刚发现很多人仍在寻找如何允许ACTION_MANAGE_OVERLAY_PERMISSION 永久喜欢如果用户有允许权限一次然后不要每次打开应用程序时都询问所以听听解决方案你——
检查设备是否有 API 23+
如果 API 23+ 然后检查用户是否有许可
如果有过许可,请不要将他带到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)) {
// You don't have permission
checkPermission();
} else {
// Do as per your logic
}
}
}
现在终于是 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;