Android 6.0運行時權限詳解

2021-02-15 郭霖

今年第三季度,蘋果IOS商店中國區收入首次超過美國,達到17億美元以上,這一結果比美國區收入高出15%。值得注意的是,中國IOS商店75%的收入增長來源於遊戲。排在遊戲之後的是娛樂類別,包括以愛奇藝、騰訊視頻和優酷等在線視頻應用為代表的在線視頻應用。在線視頻應用已將觸及範圍延伸到手機屏幕之外,顛覆了傳統有線電視市場。在此之後的分別是社交、圖書以及攝影類別。另外專業人士分析,隨著消費者行為不斷成熟,預計從現在到2020年,中國的絕對收入增長將超過其他所有國家和地區。

本篇來自 容華謝後 的投稿,擼了一遍6.0的運行時權限,並介紹了一個相關開源庫。因為7.0已經發布,以後低版本的Android產品將會逐漸減少,所以我認為從6.0開始的運行時權限是以後開發必不可少的環節。希望本文能夠幫助那些基於較低SDK版本開發的朋友。

容華謝後 的博客地址:

http://blog.csdn.net/kong_gu_you_lan

Android 6.0之前,權限在應用安裝過程中只詢問一次,以列表的形式展現給用戶,然而大多數用戶並不會注意到這些,直接就下一步了,應用安裝成功後就會被賦予清單文件中的所有權限,應用就可以在用戶不知情的情況下進行非法操作(比如偷偷的上傳用戶數據)。

Android 6.0版本中運行時權限的出現解決了這一問題,一些高危權限會在應用的運行過程中動態申請,這樣用戶就可以選擇是否允許,比如一個單機遊戲要獲取通訊錄權限,那肯定要禁止了。

並不是所有的權限都需要動態申請,需要申請的權限如下表所示: 

注意:同一組內的任何一個權限被授權了,其他權限也自動被授權。例如,一旦 READ_CALENDAR 被授權了,應用也有 WRITE_CALENDAR 權限了。

通過一個Demo來了解運行時權限的處理,先上圖:

第一次申請權限,拒絕後再次申請,申請成功:

多次拒絕後,點擊不再提示:

二話不說,上代碼:

首先來看requestPermission方法

1. 首先判斷當前應用有沒有 CAMERA 權限,如果沒有則進行申請:

if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)

2. 如果沒有CAMERA權限,進行如下判斷,當第一次申請權限時  shouldShowRequestPermissionRationale 返回 false,第一次用戶拒絕,再次申請的時候返回 true,在此判斷中提示用戶為什麼要申請這個權限。

if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA))

3. 如果用戶點擊了允許,則調用 requestPermissions 方法申請權限,注意裡面接收的參數是一個 String數組,也就是說可以同時申請多個權限,不過不建議這麼做。

//申請相機權限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);

onRequestPermissionsResult回調方法

此方法是權限申請的回調方法,在此方法中處理權限申請成功或失敗後的操作。

因為可以同時申請多個權限,所以回調的結果是以數組方式返回的,如果用戶點擊允許的話,此判斷為 true,可以在裡面處理打開攝像頭的操作。

if(grantResults[0] == PackageManager.PERMISSION_GRANTED)

當多次(兩次或兩次以上)請求操作時,會有不再提示的選擇框,如果用戶選擇了不再提示,shouldShowRequestPermissionRationale false,在此判斷中提示用戶權限已被禁止,需要在應用管理中自行打開。


shouldShowRequestPermissionRationale()說明

shouldShowRequestPermissionRationale() 默認返回 false

第一次請求權限時,如果用戶拒絕了,再次請求時 shouldShowRequestPermissionRationale() 返回 true

多次請求權限(超過一次),用戶如果選擇了不再提醒並拒絕, shouldShowRequestPermissionRationale() 返回 false

設備的策略禁止當前應用獲取這個權限的授權, shouldShowRequestPermissionRationale() 返回 false

第三方庫PermissionsDispatcher

PermissionsDispatcher 通過註解的方式,動態生成類處理運行時權限。配合插件使用,可自動生成代碼。

github地址:

https://github.com/hotchemi/PermissionsDispatcher

使用方法如下:

1. 將下面這段代碼添加到 project 的 build.gradle 文件中:


2. 將下面的代碼添加到 app module 的 build.gradle 文件中,${latest.version} 填寫最新的版本號,目前為2.1.3。


3. 在 Android Studio 中選擇File—Setting—Plugins,搜索 PermissionsDispatcher,點擊 install 安裝,如下圖所示:

4. 準備工作已經完成了,下面來進行代碼的生成,在 Android Studio 中選擇Code—Generate—Generate Runtime Permissions,如下圖所示:

@NeedsPermission 當申請的權限被用戶允許後,調用此方法。

@OnShowRationale 當第一次申請權限時,用戶選擇拒絕,再次申請時調用此方法,在此方法中提示用戶為什麼需要這個權限。

@OnPermissionDenied 當申請的權限被用戶拒絕後,調用此方法

@OnNeverAskAgain 當用戶點擊不再詢問後,調用此方法。

代碼處理如下:


為了保持兼容性建議使用v4包的兼容方法:

ContextCompat.checkSelfPermission() 

ActivityCompat.requestPermissions() 

ActivityCompat.OnRequestPermissionsResultCallback 

ActivityCompat.shouldShowRequestPermissionRationale()

當 targetSdkVersion 小於 23,但是設備是6.0系統時:

當targetSdkVersion 大於等於 23,但是設備系統小於6.0時:

設備權限模型使用老的版本

清單文件中列出的權限只會在安裝時詢問

Demo下載地址:

http://download.csdn.net/detail/kong_gu_you_lan/9628379

GitHub地址:

https://github.com/alidili/PermissionDemo

每天學習累了,看些搞笑的段子放鬆一下吧。關注最具娛樂精神的公眾號,每天都會有好心情。

如果你有好的技術文章想和大家分享,歡迎向我的公眾號投稿,投稿具體細節請在公眾號主頁點擊「投稿」菜單查看。

歡迎長按下圖 -> 識別圖中二維碼或者掃一掃關注我的公眾號:

相關焦點

  • 詳解Android 6.0運行時權限
    那麼今天不給大家帶來什麼高端複雜的技術,而是一篇簡單易懂的6.0運行時權限講解。我知道目前國內大多數的項目都還沒有去兼容6.0系統,但現在6.0的設備已經慢慢多起來了,足以引起我們的重視,希望這篇文章可以給大家帶來幫助,提前祝大家周末愉快。本篇文章由 yuyue 投稿,在此表示感謝。
  • Android 6.0 運行時權限處理
    運行時權限介紹Android 6.0在我們原有的AndroidManifest.xml聲明權限的基礎上,>又新增了運行時權限動態檢測,以下權限都需要在運行時判斷:身體傳感器日曆攝像頭通訊錄地理位置麥克風電話簡訊存儲空間運行時權限處理Android6.0系統默認為targetSdkVersion小於23的應用默認授予了所申請的所有權限,所以如果你以前的APP設置的targetSdkVersion低於23,在運行時也不會崩潰,但這也只是一個臨時的救急策略
  • Android6.0運行時權限的處理及解決辦法
    問題背景隨著今年Android6.0系統的國產ROM終於來了,適配6.0已經勢在必行了。最近也有很多開發者在微信私聊和諮詢我遇到的問題,其中有一些都是關於Android6.0權限的,我感覺有必要寫一篇文章來解惑了。Runtime Permissions在6.0系統的幾個變化中,還是比較大的。
  • Android 6.0運行時權限,看這篇就夠了
    Android 6.0,代號棉花糖,自發布伊始,其主要的特徵運行時權限就很受關注。因為這一特徵不僅改善了用戶對於應用的使用體驗,還使得應用開發者在實踐開發中需要做出改變。沒有深入了解運行時權限的開發者通常會有很多疑問,比如什麼是運行時權限,哪些是運行時的權限,我的應用是不是會在6.0系統上各種崩潰呢,如何才能支持運行時權限機制呢。
  • Android動態權限詳解
    谷歌於2015年推出Android 6.0 Marshmallow,其中一個主要特點便是加入了危險權限管理。這裡的「危險權限管理」就帶來了「運行時權限」這個新特性。危險權限管理」即在進行一些涉及到用戶隱私的操作時,需要獲取用戶的授權才能使用。如通訊錄、簡訊、相機、定位等隱私權限。獲取用戶權限,谷歌提倡在應用運行時向其授權,簡稱,運行時權限(也被叫做「動態權限/動態授權」,後文稱「動態權限」)。
  • Android 6.0以前國產手機權限處理
    導致很多app濫用權限給用戶造成風險,於是在6.0後Android推出9組危險權限,要求開發者不僅要在menifest註冊還要動態申請權限,比如調用拍照會彈出權限提示,只有用戶自己點了確定才能繼續拍照。了解了Android6.0權限機制後,我們用系統的權限API對國產手機測試一下。
  • Android 6.0: 動態權限管理的完美解決方案
    Android 6.0 版本(Api 23)推出了很多新的特性, 大幅提升了用戶體驗, 同時也為程式設計師帶來新的負擔
  • 如何優雅地申請Android運行時權限
    目錄:1、Android權限的演化2、運行時權限的申請3、Android權限開源庫4、如何優雅地申請權限Android6.0之前,應用權限僅需在代碼裡AndroidManifest.xml中聲明便可以獲得,不需要徵求用戶的同意。
  • Android權限機制與適配經驗
    權限機制,作為Android M的一大特性,受到了很多開發者的關注。本文主要分享了以下幾個知識點的內容,1、Android權限機制關鍵知識點;2、QQ音樂對於權限的適配經驗;3、近段時間以來遇到的一些Android權限方面的問題。OK,下面進入主題。二、Android權限機制已經了解過基本知識的,建議直接跳到第三點(QQ音樂的權限適配經驗)。
  • Android權限機制,你真的了解嗎?
    下面分別簡單介紹下各個標籤的含義:android:name:權限的名字,uses-permisson使用的。android:permissionGroup:權限的分類,在提示用戶安裝時會把某些功能差不多的權限放到一類。
  • Android 自定義權限真的安全嗎?
    一般來說,當我們需要在組件間跨應用通信時,我們都需要提供某種形式的權限驗證來保證通信安全。在 Android 上,我們通過在聲明組件時加入 android:permission 屬性來添加權限驗證,這裡的權限一般是用戶自定義權限。
  • 你真的了解Android權限機制嗎?
    框架層因為 Android 6.0 之前組件不能在運行時改變權限,所以系統的權限檢查執行過程是靜態的。這個情況下,組件的角色和權限的等安全屬性會被放置在元數據中,即 AndroidManifest.xml 文件中,而不是組件的本身。
  • Android應用權限大全
    變成磚頭android.permission.BRICK,能夠禁用手機,非常危險,顧名思義就是讓手機變成磚頭應用刪除時廣播android.permission.BROADCAST_PACKAGE_REMOVED,當一個應用在刪除時觸發一個廣播
  • Liunx權限詳解
    文件列表(單個或者多個文件、文件夾) 範例:設置所有用戶可讀取文件 a.confchmod ugo+r a.conf或chmod a+r  a.conf設置 c.sh 只有 擁有者可以讀寫及執行chmod u+rwx c.sh設置文件 a.conf 與 b.xml 權限為擁有者與其所屬同一個群組
  • android 6.0指紋識別開發
    需要的權限<uses-permission android:name="android.permission.USE_FINGERPRINT"/>獲取manger的幾種方式fingerprintManager = FingerprintManagerCompat.from(this
  • 五種控制Android應用的權限的方法
    3, 用戶有權自主地在抑制應用程式的部分權限時,繼續使用該應用程式,而只承擔由於自行設置不當而帶來的後果。用戶擁有設備的所有權,因此有權自主控制設備上的內容、傳感器等對象的訪問;同時有權(不)運行,(不)編譯設備上的應用程式。大多數應用程式在運行時,並未達成主動告知的義務,是失誤;然而即使主動告知,用戶還是可以不理會。
  • Android 設備信息獲取詳解
    如果是Android 6.0 之後的代碼請使用動態申請權限的方法申請權限,否認會報安全異常的錯誤SecurityException,進而導致運行報錯。如需了解更多 系統安全權限的內容,請看 之前寫的文章 Android 系統權限使用詳解四、 獲取手機廠商名、產品名、手機品牌、手機型號、主板名、設備名的方法獲取手機廠商名、產品名、手機品牌、手機型號、主板名、設備名的方法如下: /** * 獲取廠商名 * **/ public static String
  • 你要的適配全都在這裡了—基於Android6.0~9.0
    而現在谷歌已經出了Android P的穩定版,而且谷歌粑粑,為了大家能給辛苦熬夜加班,特地的和個大市場合作,要強制推出9.0的適配,而近期在下不才,為了報著多踩坑的心態,做了一下7.0~9.0的適配,臉頰也是老淚兩行2.安卓6.0的適配2.1 怎麼適配● 在6.0所有權限都需要申請?曰:當然不是。
  • 使用 ARChon 運行時環境在 Ubuntu 上運行 Android 應用
    在此之前,我們嘗試過在多款安卓應用模擬器工具上運行安卓應用,比如Genymotion、VirtualBox和Android SDK等。如今,一位名為Vlad Filippov的開發者已經找到了一種把安卓應用移植到桌面端Chrome瀏覽器的方法。他把chromeos-apk腳本和ARChon安卓運行環境擴展程序兩者緊密結合在一起,使得安卓應用可以運行在Windows、Max和Linux系統的桌面端Chrome瀏覽器中。應用藉助這種運行環境時的性能並不是很好。
  • Android 8.0適配指北
    所以如果你還沒有適配6.0或7.0可以先看看我之前的兩篇了解一下。1. 談談Android 6.0 的動態權限管理https://blog.csdn.net/qq_17766199/article/details/520135012.