Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android6.0權限管理

Android6.0權限管理

編輯:關於Android編程

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
點擊上面的所有權限,可以查看到該應用所有的權限。
這是所有的權限,包括normal and dangerous
那麼對於dangerous permission的話,在使用前需要去檢查該permission是否已經被授予
checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED

如果該權限已經被授予,那麼可繼續執行你的代碼,如果未授予,則需要向用戶詢問是否需要授予權限,彈出的框是系統界面,界面如下:
這裡寫圖片描述
調用代碼:

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

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

@Override
public 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="/uploadfile/Collfiles/20160401/20160401094555413.png" title="" />
如果一組中有一個被授予了,那麼組內的也會默認被授予。

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

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

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved