我一直在收到一些小米设备(例如Mi 2,运行API级别21)没有显示叠加层的报告.我的应用针对API 23.
关于此,有several posts.似乎Miui设备在安装时不启用此权限(与其他Marshmallow之前的设备不同).
不幸的是,Settings.canDrawOverlays()仅适用于AndroID 23.
>检查Marshmallow之前是否尚未启用此权限的正确方法是什么?
>是否有意图将用户带到相关的MUIU设置页面?也许:新的Intent(“androID.settings.action.MANAGE_OVERLAY_PERMISSION”,packagename)但我无法测试这个.
解决方法:
使用以下方法检查您是否具有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; }}
自定义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);}
总结 以上是内存溢出为你收集整理的android – 如何处理SYSTEM_ALERT_WINDOW权限未在某些Marshmallow设备上自动授予全部内容,希望文章能够帮你解决android – 如何处理SYSTEM_ALERT_WINDOW权限未在某些Marshmallow设备上自动授予所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)