白天在做SDK23版本的適配,遇到了不少坑,現在抽空記下來,以此為戒。
首先要知道哪些坑,就得先了解一些定義和基本使用方式。
那么先介紹一下動態申請的權限分組情況。
下面的權限組是由谷歌官方定義的,目的是在申請權限時,只要用戶允許同一權限組的任意一條權限,那么該組的其他權限也就默認是允許的。不過據高人介紹,在使用時最好是用到哪個權限就具體的請求該權限,因為保不齊哪天谷歌一高興就把權限組換了甚至刪了
group:android.permission-group.CONTACTSpermission:android.permission.WRITE_CONTACTSpermission:android.permission.GET_ACCOUNTSpermission:android.permission.READ_CONTACTSgroup:android.permission-group.PHONEpermission:android.permission.READ_CALL_LOGpermission:android.permission.READ_PHONE_STATEpermission:android.permission.CALL_PHONEpermission:android.permission.WRITE_CALL_LOGpermission:android.permission.USE_SIPpermission:android.permission.PROCESS_OUTGOING_CALLSpermission:com.android.voicemail.permission.ADD_VOICEMAILgroup:android.permission-group.CALENDARpermission:android.permission.READ_CALENDARpermission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERApermission:android.permission.CAMERAgroup:android.permission-group.SENSORSpermission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATIONpermission:android.permission.ACCESS_FINE_LOCATIONpermission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGEpermission:android.permission.READ_EXTERNAL_STORAGEpermission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONEpermission:android.permission.RECORD_AUDIOgroup:android.permission-group.SMSpermission:android.permission.READ_SMSpermission:android.permission.RECEIVE_WAP_PUSHpermission:android.permission.RECEIVE_MMSpermission:android.permission.RECEIVE_SMSpermission:android.permission.SEND_SMSpermission:android.permission.READ_CELL_BROADCASTS
其實權限組的定義很簡單,下面簡單介紹下動態申請權限的步驟。
第一步,檢查app擁有的權限。
if(ContextCompat.checkSelfPermission(mActivity,Manifest.permisson.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {//當前Activity沒有獲得READ_CONTACTS權限時}else{//否則已允許}第二步,申請權限。
ActivityCompat.requestPermissions(mActivity,new String[]{Manifest.permission.READ_CONTACTS},REQUEST_CODE_PERMISSION_CONTACTS);第三步,權限申請回調方法。
@Overridepublic void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {switch (requestCode) {case REQUEST_CODE_PERMISSION_CONTACTS: {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//用戶已授權} else {//用戶拒絕權限}return;}}}如此三步,看上去很簡單,可真要用起來可就沒有那么簡單了。
下面就說說這里邊的坑吧。
坑一、權限申請只能在Activity或者Fragment的上下文中,不能用getApplicationContext()。
由于我們項目在應用初始化時要獲取內存的存儲路徑并創建一系列文件緩存,這些操作都是寫在Application的onCreate()中調用不同的Util工具類進行的,所以在Android6.0以上這么寫就有點不太靠譜了。目前我的解決措施是在應用程序初始化時,先判斷SDK版本,只對版本號小于23的app創建緩存文件,高于23的則在進入Activity之后再初始化。
坑二、權限申請時使用的請求碼必須小于16。
至于什么原因不太清楚,可能谷歌公司認為權限本來就不多,沒必要將請求碼弄得很大占用多余的內存吧。說到請求碼,也就是上面代碼中未定義的常量值REQUEST_CODE_PERMISSION_CONTACTS,如果你定義的這個值超過了15,運行時就會報安全異常,提示請求碼必須小于16。
以上所述是小編給大家介紹的Android6.0動態申請權限所遇到的問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
新聞熱點
疑難解答