最近在弄安卓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權限的東西,所以我們也有借口不去弄,反觀現在的微信,支付寶,微博,餓了么都已經做了運行時權限的處理,還有什么借口不去弄呢,沒弄的小伙伴們趕緊兼容吧。