最近在弄安卓6.0权限的东西,看了一下谷歌的文档,然后进行了一下封装。
其实关于安卓6.0权限的文章有很多了,各种封装也有,随便找两篇看一下就行了,反正千篇一律就是把谷歌的翻译一下而已。
在正常情况下按照那些步骤也运行正常。
但目前发现在小米手机上有两个问题。
-
shouldShowRequestPermissionRationale()总是返回false
官方对这个方法的介绍是这样的
为了帮助查找用户可能需要解释的情形,Android 提供了一个实用程序方法,即 [shouldShowRequestPermissionRationale()](https://developer.android.com/reference/android/support/v4/app/ActivityCompat.html?hl=zh-cn#shouldShowRequestPermissionRationale(android.app.Activity, java.lang.String))
。如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true
注:如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don't ask again 选项,此方法将返回 false
。如果设备规范禁止应用具有该权限,此方法也会返回 false
一般情况下,用户拒绝了权限之后这个方法会返回true,我们需要弹出一个窗口提示用户为什么需要这个权限。
但是在小米手机下,这个方法永远会返回false。这个问题影响不大,在false 的情况下我们执行
ActivityCompat.requestPermissions(mContext, permissions, requestCode);
用户拒绝权限之后弹出框引导用户去设置里面打开权限就好了。
-
ContextCompat.checkSelfPermission(context, permission)
这个方法用来判断权限是否已经申明,如果已经有这个权限了会返回PackageManager.PERMISSION_GRANTED,否则会返回其他。
但是我在小米手机下做了如下操作:设置权限为询问状态,然后返回APP后对权限进行拒绝。
这个操作之后再调用这个方法后回一直返回PackageManager.PERMISSION_GRANTED。
我使用了如下代码代替了这个方法,发现可行
PermissionChecker.checkPermission(this, permission,Process.myPid(),Process.myUid(), getPackageName())
不知道小米的ROOM对权限做了什么,
应该是小米的权限通过了,但是原生的权限没有通过。
-
ActivityCompat.requestPermissions(context, permissions, requestCode)
用上面的操作流程还会出现一个问题就是在调用这个方法之后直接返回了已经授权,
简直坑爹啊。
目前还没有找到可以替代的方法,只能在onRequestPermissionsResult中再执行一遍checkPermission。
坑爹的小米手机,从2s开始用起已经有四部小米手机,结果这样坑我。
-
最后
之前很多APP都没有兼容6.0权限的东西,所以我们也有借口不去弄,反观现在的微信,支付宝,微博,饿了么都已经做了运行时权限的处理,还有什么借口不去弄呢,没弄的小伙伴们赶紧兼容吧。