1) 在 API 23 之前的版本中,已经授予了权限,因为用户在安装时授予了该权限。
编辑:Android 6 上似乎有一个错误(这将在 6.0.1 上得到修复 https://code.google.com/p/android/issues/detail?id=196597),如果用户拒绝此权限,应用程序将崩溃并出现 SecurityException。但不知道谷歌是如何修复它的。
2)这样:
public static void requestSystemAlertPermission(Activity context, Fragment fragment, int requestCode) {
if (VERSION.SDK_INT < VERSION_CODES.M)
return;
final String packageName = context == null ? fragment.getActivity().getPackageName() : context.getPackageName();
final Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + packageName));
if (fragment != null)
fragment.startActivityForResult(intent, requestCode);
else
context.startActivityForResult(intent, requestCode);
}
然后,在 onActivityResult 中,您可以检查是否授予了权限,如下所示:
@TargetApi(VERSION_CODES.M)
public static boolean isSystemAlertPermissionGranted(Context context) {
final boolean result = VERSION.SDK_INT < VERSION_CODES.M || Settings.canDrawOverlays(context);
return result;
}
编辑:目前,如果您将应用程序发布到 Play 商店,您的应用程序将自动授予此权限。你可以阅读相关内容here https://commonsware.com/blog/2016/03/24/system-alert-window-now-more-hidden-than-ever.html。当我询问它时,我认为它是 Android 本身的一部分,因为我认为我们需要的只是为 targetSdkVersion 设定一个足够高的值。 Google 写给我的内容(here https://code.google.com/p/android/issues/detail?id=222195)是他们希望避免流行应用程序出现问题。
我建议正确处理此权限,即使您会自动授予它。