Android MIUI通知类短信权限的坑
MIUI的坑爹设计还真不少。比如说,MIUI手机不插SIM卡就不能USB调试安装应用,好,插,结果又让你先登录小米账号(无话可说)。MIUI权限申请也是坑!
就拿READ_SMS这个权限来说,按照安卓规范来动态申请,它不弹窗让用户允许,然后回调却是成功的,到设置里一看,该权限还是询问状态。这什么逻辑啊!
然后想实现自动填短信验证码,不好意识,我MIUI自定义了一个通知类短信权限(Service_SMS),你不知道怎么申请,也不知道怎么在manifest注册。所以你没有权,也限监听不到的。我也不知道这个权限完整的名字叫什么,看设置里只有两种状态(没有询问,估计也没法动态申请)。
目前有一种方案就是你引导用户去开启,但是现在短信都是通知条的形式,还会有个复制按钮,这样做其实多此一举,但如果是其他敏感权限或许有这么做的价值。如下:
1、首先判断系统是不是MIUI,然后在需要的Activity调用goPermissionSettings(Activityactivity);
2、在相应activity重写onActivityResult,根据request_code,回调就直接执行需要用到权限的业务代码。但是用户到底给了权限没,其实也没法判断,只能“盲调”(自己创的一个词)需要权限的代码,所以需要try/catch一下,崩了就说明没有权限,没问题就说明给了权限。
3、可以用sharePreference记录下授权状态,不用每次都引导下(但这样还是可能出现用户给过权限后又手动关掉的情况)。上面的try/catch很重要啊,catch里可以做些处理,再引导一次或者你还有其他想法。
publicclassMiuiUtils{ privateMiuiUtils(){ thrownewUnsupportedOperationException("ucan'tinstantiateme..."); } privatestaticfinalStringKEY_MIUI_VERSION_CODE="ro.miui.ui.version.code"; privatestaticfinalStringKEY_MIUI_VERSION_NAME="ro.miui.ui.version.name"; privatestaticfinalStringKEY_MIUI_INTERNAL_STORAGE="ro.miui.internal.storage"; publicstaticfinalintREQUEST_CODE_SERVICE_SMS=100; /** *@returnwhetherornotisMIUI *@linkhttp://dev.xiaomi.com/doc/p=254/index.html */ publicstaticbooleanisMIUI(){ Stringdevice=Build.MANUFACTURER; LogUtils.v("Build.MANUFACTURER="+device); if(device.equals("Xiaomi")){ Propertiesprop=newProperties(); try{ prop.load(newFileInputStream(newFile(Environment .getRootDirectory(),"build.prop"))); }catch(IOExceptione){ e.printStackTrace(); returnfalse; } returnprop.getProperty(KEY_MIUI_VERSION_CODE,null)!=null ||prop.getProperty(KEY_MIUI_VERSION_NAME,null)!=null ||prop.getProperty(KEY_MIUI_INTERNAL_STORAGE,null)!=null; }else{ returnfalse; } } publicstaticvoidgoPermissionSettings(Activitycontext){ Intentintent; try{//MIUI8/9 intent=newIntent("miui.intent.action.APP_PERM_EDITOR"); intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity"); intent.putExtra("extra_pkgname",context.getPackageName()); context.startActivityForResult(intent,REQUEST_CODE_SERVICE_SMS); }catch(ActivityNotFoundExceptione){ try{//MIUI5/6 intent=newIntent("miui.intent.action.APP_PERM_EDITOR"); intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity"); intent.putExtra("extra_pkgname",context.getPackageName()); context.startActivityForResult(intent,REQUEST_CODE_SERVICE_SMS); }catch(ActivityNotFoundExceptione1){ //应用信息界面 intent=newIntent( Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uriuri=Uri.fromParts("package",context.getPackageName(), null); intent.setData(uri); context.startActivityForResult(intent,REQUEST_CODE_SERVICE_SMS);; } } } }
给个有用的ADB命令.可以获取当前Activity的信息,不然你以为,是怎么知道上面goPermissionSettings(Activityactivity)方法里,跳转到MIUI权限设置的Activity的包名和完整类名的:
adbshelldumpsysactivity|findstr"mFocusedActivity"
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。