android 許可權分 2 種:普通許可權和危險許可權,這 2 種許可權都需要在 androidmanifest 清單檔案中宣告。
在程式執行時期自動獲取,只需要在清單檔案中宣告即可。最常用的就是 internet 網路許可權。
接下來,我們對許可權申請流程做乙個簡要說明:
判斷 api 版本是否小於 23。如果版本低於 23,則不需要動態申請許可權,否則呼叫 checkselfpermission() 方法檢查許可權是否已申請。如果 checkselfpermission 返回
false,說明許可權並沒有申請,此時需要呼叫requestpermission方法主動傳送申請許可權的操作。
上述描述的流程中,在呼叫 requestpermission 方法申請許可權之前,還有一步比較重要的操作:判斷是否需要展示 shouldshowrequestpermissionrationale
shouldshowrequestpermissionrationale 這個方法會返回以下兩種情況
針對返回 true 的情況很容易處理,這種情況表示使用者已經拒絕過申請操作,但是並沒有選中「never ask again」選項,因此我們只需要再次呼叫 requestpermission 方法申請許可權即可,系統會自動彈出申請許可權的對話方塊。
但是對於返回 false 的情況稍微麻煩一點,因為有 2 種情況會返回 false,而針對這 2 種情況所對應的相應反饋操作也不一樣。比如如果使用者從來沒有申請過此許可權,那就同上述返回 true 的操作一樣,直接呼叫 requestpermission 方法申請許可權即可;但是如果是因為使用者之前拒絕申請操作,並且勾選「never ask again」選項,此時我們不應該再執行 requestpermission 方法,而是應該彈出自定義的對話方塊,提示使用者此操作必須通過許可權申請之後才可繼續進行,並給使用者提供進入許可權設定介面的入口。
需要注意的一點是 shouldshowrequestpermissionrationale 返回 true接下來就是申請許可權的流程,上文中已經介紹在申請許可權之前,需要呼叫 shouldshowrequestpermissionrationale 方法判斷使用者之前的操作,因此**修改如下:的情況在很多國內廠商的手機中設定了自動遮蔽,也就是沒有返回 true 的情況,比如華為、小公尺等手機。
同之前的 logutils 課時內容一樣,對於 permission 的動態申請也可以借助於開源的三方庫來加快開發速度。目前對 permission 動態申請支援比較好的開源庫有以下幾個:
dexter
easypermissions
permissionsdispatcher
但是三方庫的使用也具有一定的隱患,因為不同版本中 android 系統對 permission 的處理政策並不完全一致,以後在新版本的系統中很有可能會新增對許可權申請更嚴格的請求策略。比如在 android 10 中,android 系統就增加了對外置儲存訪問的限制,正常情況下我們可以通過以下**獲取外接儲存的根路徑:
複製
environment.
getexternalstoragedirectory()
.getabsolutepath
checkselfpermission 檢查某許可權是否已申請。
requestpermissions 主動傳送申請許可權的請求。
shouldshowrequestpermissionrationale 判斷使用者之前對申請許可權做出的相應動作。
Android動態許可權
請看這裡 tip1 判定是否有許可權 checkselfpermission tip2 如果沒有許可權,彈出dialog給使用者選擇 requestpermission 第二個引數code與onrequestpermissionresult 方法中的code對應 if checkselfpermis...
Android6 0許可權適配
android6.0許可權適配 1.複寫activity onrequestpermissionsresult override public void onrequestpermissionsresult int requestcode,string permissions,int grantre...
Android 動態許可權申請
1.android6.0以下系統,只要在mainfest中註冊了,則自動授權,不會彈出許可權詢問的對話方塊。2.android6.0系統,同一組許可權中如果有乙個許可權動態授權,則改組的所有的許可權自動授權 需要先在mainfest中註冊 3.android 8.0系統。在 android 8.0 ...