android動態許可權到自定義許可權框架

sas???發表於2018-10-15

大家都知道android版本6.0(M)以後需要動態申請許可權,今天我們就講解下關於這塊的知識點,然後用我們之前學的註解知識,寫一個略微裝逼的自定義框架,這篇先科普下基本知識


2657154-27151ac9c7940506.png

其實關於動態許可權申請,androidM以後將許可權劃分出來一個危險許可權,比如拍照啊錄音等,你沒啥事申請這些想幹嘛?所以就讓使用者自己去管理是否同意。
6.0的時候某個應用在其清單中列出 READ_EXTERNAL_STORAGE 和WRITE_EXTERNAL_STORAGE。應用請求 READ_EXTERNAL_STORAGE,並且使用者授予了該許可權。如果該應用針對的是 API 級別 24 或更低階別,系統還會同時授予 WRITE_EXTERNAL_STORAGE,因為該許可權也屬於同一 STORAGE 許可權組並且也在清單中註冊過。如果該應用針對的是 Android 8.0,則系統此時僅會授予 READ_EXTERNAL_STORAGE;不過,如果該應用後來又請求 WRITE_EXTERNAL_STORAGE,則系統會立即授予該許可權,而不會提示使用者。
可以說是8.0的一次改變,當然對使用者感知是沒啥的。
我們列舉下危險許可權有哪些,允許我偷張圖,可見許可權還是分組的


2657154-3c47f102ce816104.png
許可權列表

可以看出來,這些許可權直接關係我們的隱私。
那麼我們動態許可權申請第一步該做什麼呢?


2657154-12275516a5d38cd3.png

在AndroidManifest.xml配置需要的許可權,因為不寫,只要申請肯定崩潰


2657154-10da51fe63d7308d.png

第二步呢?肯定是android 版本判斷啦,如果是低於23肯定就不用動態申請了


2657154-6f6b43def27fc663.png
判斷系統版本

以前有個騷操作就是把 targetSdkVersion改成低於23的 ,這樣就不需要做6.0許可權配置
但是隨著谷歌的強行限定現在慢慢的版本都推到26以上了,所以還是別這麼做了
寫上我們需要申請的許可權


2657154-e7e2f10dee1710f0.png
需要申請的許可權

檢測是否擁有許可權


2657154-1599af188a99ed78.png

PERMISSION_GRANTED代表申請到了許可權,PERMISSION_DENIED代表還木有
2657154-05e4ce48556f65c1.png

如果當前還沒有申請到許可權,那我們就要使用
ActivityCompat.requestPermissions,需要傳三個引數,第一個是Context,第二個是申請許可權的陣列,第三個是申請許可權的code。


2657154-5e5941b83a2daf9a.png

申請許可權完成,我們要知道我們申請成功了麼
覆蓋onRequestPermissionsResult 方法


2657154-fc2e50988cde42a0.png

我們發現permissions和grantResults都是陣列,如果我們在申請多個許可權的時候,返回的資料就會是多個,和後面的grantResults一一對應,我們就知道哪個許可權申請成功,哪個失敗,方便我們再次申請
我們這裡只申請了一個,先來測試一下,成功和失敗是怎麼對應的
2657154-62655aa44ee1bbb9.png

先測試失敗的


2657154-8326d7fc7661a0a7.png

測試成功的


2657154-fc2b8f3b1b78185b.png

是不是和我們之前的PERMISSION_GRANTED和PERMISSION_DENIED對應起來了?
大家是不是見過這種選項,一旦勾選拒絕了,我們該怎麼辦?
2657154-80d739e8c5993022.png

我們看下拒絕後我們再次申請許可權,發現不會出來彈窗了,這咋辦


2657154-bbf9e01500368f71.png

這個時候我們發現其實我們還是能收到回撥,但是彈窗出不來罷了
我們引入下一個方法
ActivityCompat.shouldShowRequestPermissionRationale
需要傳入倆引數 1Conctex,2申請的許可權,返回boolean值
2657154-87a62eb2c8175365.png

我們看看這個布林值的返回情況
第一次拒絕許可權申請
2657154-ae8050e6e29ca46d.png

第二次同意許可權申請
2657154-c6ae7b77d5286d1f.png

第三次拒絕加上勾選不提示


2657154-ee028e14469b91af.png

我們總結出來個啥子呢
申請失敗的時候,我們在還能再次彈出的時候,返回值是true,申請成功就不會再彈出了,申請失敗,勾選直接返回false,所以當申請失敗,不能彈出的時候,我們就可以認為被勾選了不在提示,那麼我們可以提示使用者,您拒絕了我們的許可權申請,請到設定裡面開啟,不然就無法使用XX功能。
利用許可權申請被拒絕的時候,我們也可以彈出一個彈窗告訴使用者,我們為什麼需要這個許可權,然後可以引導使用者主動申請許可權。
總結一下 動態申請許可權的幾大步驟

  • AndroidManifest加入需要申請的危險許可權,具體可以參考上面圖表
  • 檢查版本是不是大於M,android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
  • 檢查是否已經擁有我們申請的許可權了?ActivityCompat.checkSelfPermission();
  • 如果沒有,我們去申請許可權。 ActivityCompat.requestPermissions();
  • 覆蓋onRequestPermissionsResult,根據requestCode,permissions,grantResults判斷我們是否申請成功
  • 失敗的時候去利用ActivityCompat.shouldShowRequestPermissionRationale檢查我們是不是被勾選了
    禁止再詢問選項
    到此為止 最基本的許可權申請套路我們學會了,下一步我們將參考現在比較流行的註解許可權框架進行一個框架編寫。


    2657154-c87d986c0876e50b.png

相關文章