Android 6.0權限筆記

在 Androi 6.0 及以上的設備,新增了動態申請危險權限的概念。在設備需要使用某一個危險權限時,不僅需要在 AndroidManifest.xml 中進行引用,同時還需要在 APP 在使用該權限時,如果還沒有獲得用於的允許,就需要彈出一個對話框來請求用於的允許。
而在 5.1 及以下設備,普通情況下則不需要動態申請(這裏說的”普通情況”是因爲有些廠商會深度定製ROM,導致有的 5.0 或者其他版本的設備在使用某一權限的時候也會彈出對話框來請求用戶的同意),只需要在 AndroidManifest.xml 中引用即可,當用戶在安裝APP的時候,如果同意安裝,則代表TA同意來所有在 AndroidManifest.xml 中引用的權限。

對於6.0以下的權限及在安裝的時候,根據權限聲明產生一個權限列表,用戶只有在同意之後才能完成app的安裝,造成了我們想要使用某個app,就要默默忍受其一些不必要的權限(比如是個app都要訪問通訊錄、短信等)。而在6.0以後,我們可以直接安裝,當app需要我們授予不恰當的權限的時候,我們可以予以拒絕(比如:單機的象棋對戰,請求訪問任何權限,我都是不同意的)。當然你也可以在設置界面對每個app的權限進行查看,以及對單個權限進行授權或者解除授權。

引用自:Android 6.0 運行時權限處理完全解析


對於危險權限,是以組別的形式一個一個分類的,具體的危險權限和權限組可以看官方文檔(同時需要注意,在 6.0 與 7.0 之間的危險權限是有區別的):
https://developer.android.com/guide/topics/security/permissions.html?hl=zh-cn

同時,這篇文章也是基於官方文檔來寫的。

在文檔裏有說:
這裏寫圖片描述

上面的意思就是:

如果你申請某個危險的權限,假設你的app早已被用戶授權了同一組的某個危險權限,那麼系統會立即授權,而不需要用戶去點擊授權。比如你的app對READ_CONTACTS已經授權了,當你的app申請WRITE_CONTACTS時,系統會直接授權通過。此外,對於申請時彈出的dialog上面的文本說明也是對整個權限組的說明,而不是單個權限(ps:這個dialog是不能進行定製的)。
不過需要注意的是,不要對權限組過多的依賴,儘可能對每個危險權限都進行正常流程的申請,因爲在後期的版本中這個權限組可能會產生變化。
引用自:Android 6.0 運行時權限處理完全解析

這裏需要注意的是,當你動態申請某一個危險權限是,彈出來的申請框會有一個說明,而這個說明是針對申請的權限所對應的權限組來的,而不是針對於該具體的權限。如下圖:
這裏寫圖片描述


具體的動態申請權限的實現,還是可以參考:Android 6.0 運行時權限處理完全解析

其中主要涉及到兩個類:
(1)ContextCompat (android.support.v4.content.ContextCompat)
可用它的靜態方法 checkSelfPermission(Context context, String permission) 來檢查某一權限是否已經被用戶授予,方法返回值爲
PackageManager.PERMISSION_DENIED(爲該返回值則需進行申請授權)
或者PackageManager.PERMISSION_GRANTED

(2)ActivityCompat (android.support.v4.app.ActivityCompat)其父類即ContextCompat
用它的靜態方法requestPermissions(Activity activity, String[] permissions, int requestCode) 來申請授權。

申請之後就需要在AppCompatActivity 的回調方法void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 中進行權限申請回調的處理。(該方法實現自ActivityCompat.OnRequestPermissionsResultCallback接口)


最後,還需要注意一個問題,就是原本只適配到 6.0 以下的APP,如果涉及到類危險權限,又安裝到了 6.0 的設備上,會怎麼樣?或者說,適配到了 6.0 的APP,安裝到了 5.1 的設備上又會怎樣?

這裏寫圖片描述

這個就需要看 APP 的目標 SDK 了,如果只適配到 6.0 以下的APP(即targetSdkVersion<23)且涉及了危險權限,運行在 6.0 的設備上,則系統會認爲新安裝的APP還沒有支持新的權限系統而不會異常退出,當然APP相關的功能也不會正常運行。
而如果是適配了 6.0 的APP(targetSdkVersion>=23),安裝到了 5.1 的設備上,則不需要動態申請,會直接獲得該權限。另外,如果是運行在 6.0 及以上設備上,如果APP在運行時沒有獲得相關的權限,將會異常退出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章