一、Android6.0 權(quán)限變化
在Android M中權(quán)限系統(tǒng)被重新設(shè)計,發(fā)生了很大的變化。
1. 6.0以后Android權(quán)限分普通權(quán)限和危險權(quán)限,如果應(yīng)用的targetSdkVersion>=23,危險權(quán)限AndroidManifest注冊了也沒用,要用戶動態(tài)獲取的,即谷歌為了用戶安全性考慮,對危險權(quán)限不再是安裝時許可了,而是使用時讓用戶自己判斷。
二、Android6.0普通權(quán)限normal permission 和 危險權(quán)限dangerous permission
Normal?Permission:寫在xml文件里,那么App安裝時就會默認獲得這些權(quán)限,即使是在Android6.0系統(tǒng)的手機上,用戶也無法在安裝后動態(tài)取消這些normal權(quán)限,這和以前的權(quán)限系統(tǒng)是一樣的,不變。
Dangerous?Permission:還是得寫在xml文件里,但是App安裝時具體如果執(zhí)行授權(quán)分以下幾種情況:
1、targetSDKVersion?<?23?&?API(手機系統(tǒng))?<?6.0?:安裝時默認獲得權(quán)限,且用戶無法在安裝App之后取消權(quán)限。
2、targetSDKVersion?>=?23?&?API(手機系統(tǒng))?<?6.0?:安裝時默認獲得權(quán)限,且用戶無法在安裝App之后取消權(quán)限。
3、targetSDKVersion < 23 & API(手機系統(tǒng)) >= 6.0 :安裝時默認獲得權(quán)限,但是用戶可以在安裝App完成后動態(tài)取消授權(quán)( 取消時手機會彈出提醒,告訴用戶這個是為舊版手機打造的應(yīng)用,讓用戶謹慎操作 )。
4、targetSDKVersion?>=?23?&?API(手機系統(tǒng))?>=?6.0?:安裝時不會獲得權(quán)限,可以在運行時向用戶申請權(quán)限。用戶授權(quán)以后仍然可以在設(shè)置界面中取消授權(quán),用戶主動在設(shè)置界面取消后,在app運行過程中可能會出現(xiàn)crash。
三、Android 6.0+ 權(quán)限的管理?
好處:為Android系統(tǒng)的安全增強保障,用戶能夠有更加透明化的知情權(quán)。
壞處:作為開發(fā)的程序猿,就開始苦逼了 ,尤其是國產(chǎn)定制出現(xiàn)的各種奇葩,例如 魅、米 系統(tǒng)的定制沒有按照谷歌給的標準(框架)來定制,魅Android6.0(Flyme)系統(tǒng)給用戶的感覺還是6.0以下的系統(tǒng)授權(quán)方式,米Android6.0(MIUI)更牛叉,他自己的權(quán)限管理高于谷歌給予的權(quán)限 在Android系統(tǒng)設(shè)置里面設(shè)置權(quán)限管理(這個權(quán)限都是危險權(quán)限) 基本上沒有效果,只有在MIUI里面的安全管家的權(quán)限管理設(shè)置才能生效,這樣類似的定制系統(tǒng)就大大的增加了,開發(fā)者的難度。
四、Android6.0權(quán)限處理
在權(quán)限方面網(wǎng)上有很多大牛們開源的庫 :
2.RxPermissions這個庫可以與新的Android權(quán)限模型的rxjava使用M。如果你的項目里面沒有集成rxjava 庫 最好不要使用,因為不能增加應(yīng)用太多體積,當然了 如果你集成 ?還是不錯的
3.easypermissions是包裝庫來簡化基本系統(tǒng)權(quán)限的邏輯時,targetingandroid M或更高。這個也是谷歌官方開源的庫
4.AndPermission這個庫集成方便并且適配不少國產(chǎn)手機? ?Android 6.0 運行時權(quán)限管理最佳實踐
5.這個就是系統(tǒng)自帶的方法
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {// 沒有權(quán)限。if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) {// 用戶拒絕過這個權(quán)限了,應(yīng)該提示用戶,為什么需要這個權(quán)限。}else{// 申請授權(quán)。ActivityCompat.requestPermissions(thisActivity,newString[]{Manifest.permission.READ_CONTACTS}, MMM);
}}
@OverridepublicvoidonRequestPermissionsResult(intrequestCode, String permissions[],int[] grantResults) {
switch(requestCode) {
caseMMM: {
if(grantResults.length >0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 權(quán)限被用戶同意,可以去放肆了。
}else{// 權(quán)限被用戶拒絕了,洗洗睡吧。}return;
}}}
五、國產(chǎn)手機設(shè)置權(quán)限的頁面(持續(xù)更新中。。。)
這個是我從網(wǎng)上收集并總結(jié)的一個工具類
這個鏈接地址后期會發(fā)出來 (如果沒有發(fā)出來可以發(fā)郵件到我郵箱提醒我 或者回復(fù) 郵箱:1732685009@qq.com)(圖片里面的代碼鏈接)
六、總結(jié)
在處理Android6.0權(quán)限的過程中,遇到了各種各樣的問題,也在其中收獲了很多東西。在使用過程中不管是使用原生的方法還是第三方開源的庫 在適配國產(chǎn)手機或者一些定制比較深的手機還是會出現(xiàn)各種各樣的問題。Android6.0適配的道路還是任重道遠....... ?
在適配一些奇葩的手機系統(tǒng)時,在我們實在不能判斷權(quán)限有無的時候我們可以通過try catch來捕獲異常 從而減少因權(quán)限導(dǎo)致的崩潰