1. 程式人生 > >Android M許可權管理機制:Runtime Permission簡介

Android M許可權管理機制:Runtime Permission簡介

    可以說,該機制一直都在(應該是從4.2就開始存在了),但一直沒有被真正使用過… 每次Android更新OS版本,都一直是隱藏它的( 一些OEM廠商可能會在某些版本上開啟)。

    而從Android M開始,Android就正式的推出了官方的許可權管理機制:Android Runtime Permission. ( Google在M釋出的IO大會上特意說明了這一點~)

    應該說,Android Runtime Permission有一些AppOps的影子,但卻又是兩套不同的機制。而且即使從M開始使用了Runtime Permission, Google 也沒有把AppOpsService踢出,而且還保留和增加了個別基礎的API..

    本篇文章,我們就簡要說明一下Android的Runtime Permission機制.

  1. 簡介:

    從Android M開始,使用者對app許可權的管理都會在app執行時(runtime)進行,而不是在app安裝時。

    M之前: app安裝時,系統會提示該應用所包含的所有許可權。使用者如果拒絕某項許可權,只能選擇不安裝。

    M開始:app安裝時不會再有許可權的宣告,但是需要在app執行時動態的給使用者提示進行申請許可權。

    

  2. 所有應用都要服從RuntimePermission機制嗎?

    Target SDK  >= 23

的所有應用,強制使用runtimePermission機制。

    所以,如果app開發者想規避該機制,就需要把應用的TargetSDK設定為23以下。

  3. 對app開發者的要求?

    在runtime permission機制下,app安裝時許可權預設是disable的

    在app執行過程中,如果需要使用某些許可權,app必須首先確認是否具有該許可權,如果有,才可以繼續進行相應的操作。沒有的話需要向用戶申請許可權,只有使用者同意使用該許可權之後,才可以繼續進行相應操作。

    如果不判斷許可權的情況就進行操作,app不會正常工作或者直接FC, 因為許可權都是預設deny的,會有SecurityException。

  4. 都有哪些許可權預設是disable的?

    系統許可權被分為幾個類別:Normal, Dangerous, Signature, SigatureOrSystem

    Normal Permission指的是那些 app獲取它所在的sandbox(每個程序都有獨立的一個沙箱)以外的資料和資源所對應的許可權,這些許可權一般不會對使用者的隱私資訊造成風險. 比如,設定時區的許可權(SET_TIME_ZONE)。

    對於此類許可權,app申請後系統會自動賦予。

    Dangerous Permission指的是那些可能對使用者的隱私資訊造成風險,或者可能影響使用者資料的行為許可權。比如讀取使用者的聯絡人。對於Dangerous Permission,app必須顯示的獲取使用者的允許才可以正常使用。Runtime Permission機制針對的即是此類dangerous permission.

    

    Signature permission:許可權請求者只有使用和[許可權宣告者]相同的證書來簽名的情況下,才可以使用的許可權。如果證書匹配,系統會自動賦予這些許可權,不需要通知或請求使用者。

    SignatureOrSystem: 該類許可權除了上述的 Signature Permission以外,還包括那些只賦予Android System Image內的應用的許可權。Android並不建議app使用這類,因為Signature Permission已經能滿足大部分的需求,不管這些app是否是build在System Image裡。

    對於此類許可權,Android官方的說明如下:

    

  5. 如何檢查許可權狀態(是否enable)?

    可以通過以下API來檢查許可權狀態:

    android.support.v4.content.ContextCompat

    

  6. 如何向用戶申請許可權?

    申請許可權API:

    android.support.v4.app.ActivityCompat

    public staticvoid requestPermissions (Activity activity, String[] permissions,int requestCode)

    App呼叫該介面後,系統會彈出一個dialog,使用者做出選擇後,系統會觸發onRequestPermissionsResult()方法,並且傳遞使用者所做的選擇。

    App只需override該方法,根據使用者的選擇做出不同的操作即可。

  7. 申請許可權前給使用者一些解釋

    Google建議在某些情況下,給使用者一些解釋,使其更好的明白你為什麼需要申請該許可權。比如,對於一個圖片相關的app,如果要申請camera許可權,使用者可以理解。但是要申請定位許可權或者打電話許可權,就最好先給使用者一些解釋或說明。

    Android提供了一個介面 shouldShowRequestPermissionRationale,該方法在 “app之前申請過某項許可權但是被使用者拒絕” 時會返回true. Google建議首先app使用該API判斷,如果結果為true,app最好向使用者做出申請許可權的解釋。

  8. 其他需要注意的事項(googleadvice)

    只申請你確實需要的許可權

比如你的app需要拍攝照片,你可以選擇申請camera許可權,在app內進行操作,也可以傳送intent使用系統的app進行同樣的操作,你只需要得到它的結果即可,而這樣是不需要許可權的。

不要惹怒使用者

只在需要該許可權的時候才進行申請,不要一開啟app就一次性彈出多個許可權申請,那樣可能會惹怒使用者直接uninstall你的app。

做好嚴格的測試

使用者隨時可以禁止你的所有許可權,所以app開發者必須保證測試路徑的全面覆蓋。

關注博主公眾號,獲取更多內容。