今年第三季度,蘋果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。
第三方庫PermissionsDispatcherPermissionsDispatcher 通過註解的方式,動態生成類處理運行時權限。配合插件使用,可自動生成代碼。
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
每天學習累了,看些搞笑的段子放鬆一下吧。關注最具娛樂精神的公眾號,每天都會有好心情。
如果你有好的技術文章想和大家分享,歡迎向我的公眾號投稿,投稿具體細節請在公眾號主頁點擊「投稿」菜單查看。
歡迎長按下圖 -> 識別圖中二維碼或者掃一掃關注我的公眾號: