Android6.0動(dòng)態(tài)申請(qǐng)權(quán)限所遇到的問題小結(jié)
白天在做SDK23版本的適配,遇到了不少坑,現(xiàn)在抽空記下來,以此為戒。
首先要知道哪些坑,就得先了解一些定義和基本使用方式。
那么先介紹一下動(dòng)態(tài)申請(qǐng)的權(quán)限分組情況。
下面的權(quán)限組是由谷歌官方定義的,目的是在申請(qǐng)權(quán)限時(shí),只要用戶允許同一權(quán)限組的任意一條權(quán)限,那么該組的其他權(quán)限也就默認(rèn)是允許的。不過據(jù)高人介紹,在使用時(shí)最好是用到哪個(gè)權(quán)限就具體的請(qǐng)求該權(quán)限,因?yàn)楸2积R哪天谷歌一高興就把權(quán)限組換了甚至刪了
group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTS group:android.permission-group.PHONE permission:android.permission.READ_CALL_LOG permission:android.permission.READ_PHONE_STATE permission:android.permission.CALL_PHONE permission:android.permission.WRITE_CALL_LOG permission:android.permission.USE_SIP permission:android.permission.PROCESS_OUTGOING_CALLS permission:com.android.voicemail.permission.ADD_VOICEMAIL group:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDAR group:android.permission-group.CAMERA permission:android.permission.CAMERA group:android.permission-group.SENSORS permission:android.permission.BODY_SENSORS group:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATION group:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGE group:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIO group:android.permission-group.SMS permission:android.permission.READ_SMS permission:android.permission.RECEIVE_WAP_PUSH permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTS
其實(shí)權(quán)限組的定義很簡(jiǎn)單,下面簡(jiǎn)單介紹下動(dòng)態(tài)申請(qǐng)權(quán)限的步驟。
第一步,檢查app擁有的權(quán)限。
if(ContextCompat.checkSelfPermission( mActivity,Manifest.permisson.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { //當(dāng)前Activity沒有獲得READ_CONTACTS權(quán)限時(shí) }else{ //否則已允許 }
第二步,申請(qǐng)權(quán)限。
ActivityCompat.requestPermissions( mActivity, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE_PERMISSION_CONTACTS);
第三步,權(quán)限申請(qǐng)回調(diào)方法。
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case REQUEST_CODE_PERMISSION_CONTACTS: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //用戶已授權(quán) } else { //用戶拒絕權(quán)限 } return; } } }
如此三步,看上去很簡(jiǎn)單,可真要用起來可就沒有那么簡(jiǎn)單了。
下面就說說這里邊的坑吧。
坑一、權(quán)限申請(qǐng)只能在Activity或者Fragment的上下文中,不能用getApplicationContext()。
由于我們項(xiàng)目在應(yīng)用初始化時(shí)要獲取內(nèi)存的存儲(chǔ)路徑并創(chuàng)建一系列文件緩存,這些操作都是寫在Application的onCreate()中調(diào)用不同的Util工具類進(jìn)行的,所以在Android6.0以上這么寫就有點(diǎn)不太靠譜了。目前我的解決措施是在應(yīng)用程序初始化時(shí),先判斷SDK版本,只對(duì)版本號(hào)小于23的app創(chuàng)建緩存文件,高于23的則在進(jìn)入Activity之后再初始化。
坑二、權(quán)限申請(qǐng)時(shí)使用的請(qǐng)求碼必須小于16。
至于什么原因不太清楚,可能谷歌公司認(rèn)為權(quán)限本來就不多,沒必要將請(qǐng)求碼弄得很大占用多余的內(nèi)存吧。說到請(qǐng)求碼,也就是上面代碼中未定義的常量值REQUEST_CODE_PERMISSION_CONTACTS,如果你定義的這個(gè)值超過了15,運(yùn)行時(shí)就會(huì)報(bào)安全異常,提示請(qǐng)求碼必須小于16。
以上所述是小編給大家介紹的Android6.0動(dòng)態(tài)申請(qǐng)權(quán)限所遇到的問題,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android中不支持動(dòng)態(tài)申請(qǐng)權(quán)限的原因
- Android registerForActivityResult動(dòng)態(tài)申請(qǐng)權(quán)限案例詳解
- Android 如何實(shí)現(xiàn)動(dòng)態(tài)申請(qǐng)權(quán)限
- android6.0權(quán)限動(dòng)態(tài)申請(qǐng)框架permissiondispatcher的方法
- android12?SD如何動(dòng)態(tài)申請(qǐng)讀寫權(quán)限
- Android14 、15動(dòng)態(tài)申請(qǐng)讀寫權(quán)限實(shí)現(xiàn)方法示例代碼 (Java)
相關(guān)文章
Android直播app送禮物連擊動(dòng)畫效果(實(shí)例代碼)
最近在做公司的直播項(xiàng)目,需要實(shí)現(xiàn)一個(gè)觀看端連擊送禮物的控件,下面給大家分享實(shí)例代碼,需要的的朋友參考下吧2017-07-07SurfaceView開發(fā)[捉小豬]手機(jī)游戲 (一)
這篇文章主要介紹了用SurfaceView開發(fā)[捉小豬]手機(jī)游戲 (一)本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08Android Flutter實(shí)戰(zhàn)之為照片添加顏色濾鏡
這篇文章我們將利用TweenAnimationBuilder來實(shí)現(xiàn)一個(gè)圖片調(diào)色的過渡動(dòng)畫,從而實(shí)現(xiàn)為照片添加顏色濾鏡的效果,感興趣的可以了解一下2022-12-12Android應(yīng)用實(shí)現(xiàn)安裝后自啟動(dòng)的方法
今天小編就為大家分享一篇Android應(yīng)用實(shí)現(xiàn)安裝后自啟動(dòng)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08Android?使用flow實(shí)現(xiàn)倒計(jì)時(shí)的方式
這篇文章主要介紹了Android?使用flow實(shí)現(xiàn)倒計(jì)時(shí)的方式,借助Flow這個(gè)工具,更加優(yōu)雅地實(shí)現(xiàn)這個(gè)需求功能,文末給大家整理了Android?實(shí)現(xiàn)倒計(jì)時(shí)的幾種方式,需要的朋友可以參考下2022-04-04Android貝塞爾曲線實(shí)現(xiàn)消息拖拽消失
這篇文章主要為大家詳細(xì)介紹了Android貝塞爾曲線實(shí)現(xiàn)消息拖拽消失,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Android實(shí)現(xiàn)指定時(shí)間定時(shí)觸發(fā)方法
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)指定時(shí)間定時(shí)觸發(fā)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05Android開發(fā)中關(guān)于獲取當(dāng)前Activity的一些思考
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)過程中,關(guān)于獲取當(dāng)前Activity的一些思考,感興趣的小伙伴們可以參考一下2016-02-02