Android6.0許可權管理

來源:互聯網
上載者:User

Android6.0許可權管理

Android 6.0 Marshmallow首次加入了運行時許可權管理,這對使用者來說,可以更好的瞭解、控 制 app 涉及到的許可權。然而對開發人員來說卻是一件比較蛋疼的事情,需要相容適配,並保證程式功能的正常運行。
什麼叫運行時許可權管理呢?在Android 6.0以下的系統中,當我們在安裝應用的時候,該應用就會提示我們這個應用所需要的許可權,如果你要安裝,那就必須同意賦予所有許可權,但是如果不同意,那就只能取消安裝了,有點流氓。而且安裝完後,你不可以收回這個許可權。
而6.0就做到了運行時許可權管理,即使安裝的時候給了許可權,也可以到系統設定裡,去關閉該許可權。
下面分幾種情況來講,因為運行時許可權只有在Android6.0及以上的手機版本才有,所以這裡只考慮裝置版本大於6.0的手機,低版本的手機在安裝時就已經賦予了所有的許可權,也不可能收回,就不考慮了,下面的情況只分targetSdkVersion:

targetSDKVersion大於等於23的時候,那麼許可權是可以被回收(revoke),這裡還要分許可權,google將許可權分為兩種,一種是normal permission,另一種是dangerous permission。normal permission是指與使用者隱私無關的許可權,可以理解為無關緊要的許可權,比如說訪問網路的許可權,對使用者來說沒什麼關係;dangerous permission就是會涉及到使用者隱私的許可權,例如讀取使用者手機連絡人、簡訊等等。如果是normal permission的話,那麼在安裝的時候就會給,而且不會開放介面讓使用者回收該許可權,app會一直擁有該許可權,所以不用考慮這種類型的許可權。如果是dangerous permission的話,在安裝的時候並未授予許可權,系統開放介面允許使用者回收或者賦予許可權。下面是某個應用的許可權,第一張圖是dangerous permission,可以回收和賦予的。

點擊上面的所有許可權,可以查看到該應用所有的許可權。

那麼對於dangerous permission的話,在使用前需要去檢查該permission是否已經被授予
checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED

如果該許可權已經被授予,那麼可繼續執行你的代碼,如果未授予,則需要向使用者詢問是否需要授予許可權,彈出的框是系統介面,介面如下:

調用代碼:

requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 1);

系統詢問是否授予許可權的頁面結束後會有回調

@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {   super.onRequestPermissionsResult(requestCode, permissions, grantResults);    if (requestCode == 1) {        if(grantResults[0] == PackageManager.PERMISSION_GRANTED){            //your implementations        }else{            ToastUtil.show(this, "許可權不足,支付失敗");        }    }}
如果targetSdkVersion是小於23的,那麼將認為app沒有用23新許可權測試過,那麼繼續使用老規則:系統在安裝的時候會預設給app賦予所有的許可權,app可以照常運行。但是!但是!但是!使用者依然可以回收許可權,不過此回收非彼回收。先看下關閉許可權時彈的頁面:

看到了麼,如果targetSDKVersion小於23的話,在關閉許可權的時候,會彈一個警告框,告訴你這是舊版的android,關閉會有問題,如果你按拒絕,那麼該許可權將會關閉,而且介面上,許可權的開關會顯示關,但是這個許可權卻沒有被回收(nexus 5x的手機親測,當然其他的機子我也不敢打包票)。比如說我舊版的app,targetSDKVersion也少於23,然後將該app跑在6.0的手機上,並且在設定裡將許可權給關閉,重新跑該app,發現其並不會崩潰,在運行到checkSelfPermission的時候,發現某個許可權明明已經被關閉,但是這個函數卻返回告訴說該許可權被賦予,這不是見鬼了麼,而且這個許可權也能被正常使用。上網搜了一把,這種情況很多,但是網上的人情況不同,有些是關閉許可權,checkSelfPermission返回granted,但是使用許可權的時候,就拋出異常。
後來也有人說看系統日誌的,我看了下,如果targetSDKVersion等於23的話,系統日誌是:
vcu1t6ijrLK7uf3T0NCpyMvLtXRhcmdldFNES1ZlcnNpb27QodPaMjO1xGFwcKOs1rvE3M2ouf3QttTY06bTw7LFxNzK1bvYyKjP3qOs1eLQqbLCz+vJ0M601qTKtaGjPC9wPg0KPHA+u7nT0L7NysfIqM/etcS7sKOs09C31tfptcS4xcTuo6y/tMjnz8LNvKO6PGJyIC8+DQo8aW1nIGFsdD0="這裡寫圖片描述" src="http://www.bkjia.com/uploads/allimg/160403/041934B51-5.png" title="" />
如果一組中有一個被授予了,那麼組內的也會預設被授予。

而且也支援同時申請多個許可權,具體情況android developer官網。

下面是stackoverflow問題的網址:
http://stackoverflow.com/questions/36328151/ive-revoke-the-android-permission-but-checkselfpermission-still-return-granted

如有問題和錯誤的地方請指出。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.