摘要:谷歌這樣做,可以讓用戶更加清醒的認識相關權限的使用,在一定程度上更加人性化和保護了用戶的隱私。谷歌官方將權限分為了兩類,一個是正常權限,這類權限不涉及用戶隱私,是不需要用戶進行授權的,比如訪問網絡,手機震動等。
問題背景
隨著今年Android6.0系統的國產ROM終于來了,適配6.0已經勢在必行了。最近也有很多開發者在微信私聊和咨詢我遇到的問題,其中有一些都是關于Android6.0權限的,我感覺有必要寫一篇文章來解惑了。Runtime Permissions在6.0系統的幾個變化中,還是比較大的。
如果你在Android6.0系統的手機上如果遇到了這樣的錯誤,必定跟其運行時權限有關。
open failed: EACCES (Permission denied)
權限變化在Adroid系統6.0以前,權限的處理是在App安裝時授權,授權完了才能完成相關的安裝。而在6.0的系統上,是先安裝App,在安裝完之后,在使用相關權限的操作時,才會彈出權限的提示框,用戶同意授權之后才能正常使用。谷歌這樣做,可以讓用戶更加清醒的認識相關權限的使用,在一定程度上更加人性化和保護了用戶的隱私。
谷歌官方將權限分為了兩類,一個是正常權限(Normal Permissions),這類權限不涉及用戶隱私,是不需要用戶進行授權的,比如訪問網絡,手機震動等。還有一類是危險權限(Dangerous Permissions),一般是涉及到用戶隱私的,需要用戶進行授權,比如操作SD卡的寫入,相機,錄音等。
Normal Permissions:Dangerous Permissions: 解決方法ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
看完官方文檔,還好解決方案還不是太難,也不是非常麻煩,當然和以前相比還是有一點繁瑣的。廢話不多說了,解決方案如下。
檢查系統版本private boolean canMakeSmores(){ return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1); }
檢查系統版本的原因,顯而易見,如果是系統6.0及以上的,需要采用新的權限授權方法。
申請授權舉個例子,如果你需要拍照操作,那么你就應該在拍照操作的地方,先加上權限申請授權。方式如下:
String[] perms = {"android.permission.CAMERA"}; int permsRequestCode = 200; requestPermissions(perms, permsRequestCode);授權回調處理
@Override public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){ switch(permsRequestCode){ case 200: boolean cameraAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED; if(cameraAccepted){ //授權成功之后,調用系統相機進行拍照操作等 }else{ //用戶授權拒絕之后,友情提示一下就可以了 } break; } }進一步處理和完善
通過上面可以看出,只檢查系統版本了,如果授權過的權限,還需要再次去授權么?我們的判斷其實可以更完善一下,比如:
private boolean hasPermission(String permission){ if(canMakeSmores()){ return(checkSelfPermission(permission)==PackageManager.PERMISSION_GRANTED); } return true; }
上面這段代碼,是先判斷系統版本,再判斷這個權限是否已經授權過,這樣就不會重復了。
還有就是比如如果用戶第一次已經拒絕過這個權限,下次再操作時怎么辦呢?還有一個更人性化的方法就是:
shouldShowRequestPermissionRationale(@NonNull String permission)
這個方法的作用:
第一次請求權限時,用戶拒絕了,下一次:shouldShowRequestPermissionRationale() 返回 true,應該顯示一些為什么需要這個權限的說明
第二次請求權限時,用戶拒絕了,并選擇了“不在提醒”的選項時:shouldShowRequestPermissionRationale() 返回 false
設備的策略禁止當前應用獲取這個權限的授權:shouldShowRequestPermissionRationale() 返回 false
完結到這里就基本介紹完結了,希望能夠對大家有所幫助,能夠進一步理解Android6.0運行時權限的使用。繼續加油吧,學習永無止境。
移動開發者的聚集地,公眾號“非著名程序員”,每天一篇原創技術分享和移動互聯網知識分享,微信公眾號:smart_android,頭條號和百度百家賬號都是“非著名程序員”。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/65877.html
閱讀 1017·2021-10-27 14:15
閱讀 2773·2021-10-25 09:45
閱讀 1938·2021-09-02 09:45
閱讀 3363·2019-08-30 15:55
閱讀 1806·2019-08-29 16:05
閱讀 3199·2019-08-28 18:13
閱讀 3112·2019-08-26 13:58
閱讀 448·2019-08-26 12:01