小米手机适配Android6.0权限

作者: JJoom | 来源:发表于2017-04-19 14:11 被阅读3735次

    最近在弄安卓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);
      用户拒绝权限之后弹出框引导用户去设置里面打开权限就好了。
    Paste_Image.png
    • 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权限的东西,所以我们也有借口不去弄,反观现在的微信,支付宝,微博,饿了么都已经做了运行时权限的处理,还有什么借口不去弄呢,没弄的小伙伴们赶紧兼容吧。

    相关文章

      网友评论

      • Android轮子哥:推荐一个简单易用的框架,一句代码搞定权限请求,从未如此简单:https://www.jianshu.com/p/c69ff8a445ed
      • 不会飞的扫把:为什么有些手机(都是6.0.1的系统)checkSelfPermission返回true有些返回false呢?
        18e9e8279e0b:https://my.oschina.net/u/990728/blog/549914
      • 一洼世界:您好,魅族的手机有测试过吗? 我用的魅族pro6. 6.0系统 。跑了下checkSelfPermission 返回的也是False (PERMISSION_GRANTED) ,是国产机都有这个问题吗?
        一洼世界:好像我理解错了。 6.0 checkPermission 有权限才会返回true。 6.0之前 清单文件有就会返回true。
        一洼世界:@JJoom checkPermission测试的是manifest有没有注册某项权限吧,并不能判断用户是否允许或者拒绝了某项权限。 https://github.com/android-cn/android-discuss/issues/174
        JJoom:@Hi火龙果 应该是国产手机定制的问题,以可以看一下我贴出来的那段代码的源码,他是进行了两层的判断的。

      本文标题:小米手机适配Android6.0权限

      本文链接:https://www.haomeiwen.com/subject/fppczttx.html