Mar*_*ark 16 android android-overlay
我一直在收到一些小米设备(例如Mi 2,运行API级别21)没有显示叠加层的报告.我的应用针对API 23.
有几个 帖子在那里对此.似乎MIUI设备在安装时不启用此权限(与其他Marshmallow之前的设备不同).
不幸的是,Settings.canDrawOverlays()仅适用于Android 23+.
new Intent("android.settings.action.MANAGE_OVERLAY_PERMISSION", packageName)但我没办法测试这个.and*_*per 22
1)在API 23之前,已经给出了权限,因为用户在安装时授予了权限.
编辑:似乎Android 6上有一个错误(将在6.0.1上修复),如果用户拒绝此权限,应用程序将与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);
}
Run Code Online (Sandbox Code Playgroud)
然后,在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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:目前,如果您将应用程序发布到Play商店,您的应用程序将自动获得此权限.你可以在这里阅读它.当我询问它时,我认为它是Android本身的一部分,因为我认为我们所需要的是为targetSdkVersion设定足够高的值.谷歌写给我的(这里)是他们希望避免流行应用上的问题.
我建议正确处理此权限,即使您将自动授予它.
使用以下方法检查您是否具有drawOverlays权限更安全:
@SuppressLint("NewApi")
public static boolean canDrawOverlayViews(Context con){
if(Build.VERSION.SDK_INT< Build.VERSION_CODES.LOLLIPOP){return true;}
try {
return Settings.canDrawOverlays(con);
}
catch(NoSuchMethodError e){
return canDrawOverlaysUsingReflection(con);
}
}
public static boolean canDrawOverlaysUsingReflection(Context context) {
try {
AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
Class clazz = AppOpsManager.class;
Method dispatchMethod = clazz.getMethod("checkOp", new Class[] { int.class, int.class, String.class });
//AppOpsManager.OP_SYSTEM_ALERT_WINDOW = 24
int mode = (Integer) dispatchMethod.invoke(manager, new Object[] { 24, Binder.getCallingUid(), context.getApplicationContext().getPackageName() });
return AppOpsManager.MODE_ALLOWED == mode;
} catch (Exception e) { return false; }
}
Run Code Online (Sandbox Code Playgroud)
自定义ROM可以更改操作系统,以便Settings.canDrawOverlays()不可用.小米设备和应用程序崩溃后发生了这种情况.
申请许可:
@SuppressLint("InlinedApi")
public static void requestOverlayDrawPermission(Activity act, int requestCode){
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + act.getPackageName()));
act.startActivityForResult(intent, requestCode);
}
Run Code Online (Sandbox Code Playgroud)
以下是如何处理此问题的分步说明:
首先在清单文件中给予以下权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Run Code Online (Sandbox Code Playgroud)
或者
<uses-permission-sdk-23 android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Run Code Online (Sandbox Code Playgroud)
然后使用以下代码处理其余的事情:
public final static int REQUEST_CODE = 65635;
public void checkDrawOverlayPermission() {
/** check if we already have permission to draw over other apps */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
/** if not construct intent to request permission */
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
/** request permission via start activity for result */
startActivityForResult(intent, REQUEST_CODE);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
/** check if received result code
is equal our requested code for draw permission */
if (requestCode == REQUEST_CODE) {
// ** if so check once again if we have permission */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.canDrawOverlays(this)) {
// continue here - permission was granted
goYourActivity();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
只需checkDrawOverlayPermission()根据您的要求从您的 LauncherActivity 或任何地方调用。
当您执行项目时,您将看到一个窗口并要求启用该权限。获得许可后,您将能够对此做任何事情。
| 归档时间: |
|
| 查看次数: |
18190 次 |
| 最近记录: |