【威哥說(shuō)】去年怔蚌,Google升級(jí)6.0后敷硅,很重要的一點(diǎn)是權(quán)限的改變功咒,到現(xiàn)在很多總結(jié)分析權(quán)限的文章,但是或者不太詳細(xì)绞蹦,或者有疏漏力奋,下面我來(lái)給大家來(lái)總結(jié)下6.0權(quán)限的問(wèn)題。
1.這個(gè)新的運(yùn)行時(shí)權(quán)限僅當(dāng)我們?cè)O(shè)置targetSdkVersion ?23(這意味著你已經(jīng)在23上測(cè)試通過(guò)了)才起作用幽七,當(dāng)然還要是M系統(tǒng)的手機(jī)景殷。app在6.0之前的設(shè)備依然使用舊的權(quán)限系統(tǒng)。
如果app的targetSdkVersion 低于 23,那將被認(rèn)為app沒(méi)有用23新權(quán)限測(cè)試過(guò)滨彻,那將被繼續(xù)使用舊有規(guī)則:用戶在安裝的時(shí)候不得不接受所有權(quán)限藕届,安裝后app就有了那些權(quán)限咯!然后app像以前一樣奔跑亭饵!注意休偶,此時(shí)用戶依然可以取消已經(jīng)同意的授權(quán)!用戶取消授權(quán)時(shí)辜羊,android 6.0系統(tǒng)會(huì)警告踏兜,但這不妨礙用戶取消授權(quán)。
問(wèn)題又來(lái)了八秃,這時(shí)候你的app崩潰嗎碱妆?
善意的主把這事也告訴了android小組,當(dāng)我們?cè)趖argetSdkVersion 低于23的app調(diào)用一個(gè)需要權(quán)限的函數(shù)時(shí)昔驱,這個(gè)權(quán)限如果被用戶取消授權(quán)了的話疹尾,不拋出異常。但是他將啥都不干骤肛,結(jié)果導(dǎo)致函數(shù)返回值是null或者0.
2.代碼沒(méi)有成功改為支持最新運(yùn)行時(shí)權(quán)限的app,不要設(shè)置targetSdkVersion 23 發(fā)布纳本,否則你就有麻煩了。只有當(dāng)你測(cè)試過(guò)了腋颠,再改為targetSdkVersion 23 繁成。
警告:現(xiàn)在你在android studio新建項(xiàng)目,targetSdkVersion 會(huì)自動(dòng)設(shè)置為 23淑玫。如果你還沒(méi)支持新運(yùn)行時(shí)權(quán)限巾腕,我建議你首先把targetSdkVersion 降級(jí)到22
3.權(quán)限組:
同一組的任何一個(gè)權(quán)限被授權(quán)了,其他權(quán)限也自動(dòng)被授權(quán)絮蒿。例如尊搬,一旦WRITE_CONTACTS被授權(quán)了,app也有READ_CONTACTS和GET_ACCOUNTS了歌径。
權(quán)限分組官方表格如下:
下面我們來(lái)看具體的使用方法:
1.請(qǐng)求要申請(qǐng)的權(quán)限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE},2);
}else {
startActivity(new Intent(this,MainActivity.class));
finish();
}
2.請(qǐng)求后的回調(diào)方法毁嗦,根據(jù)返回的結(jié)果碼執(zhí)行操作
//動(dòng)態(tài)權(quán)限申請(qǐng)后系統(tǒng)的回調(diào)方法
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode){
case MY_PERMISSIONS_REQUEST:
for (int i = 0; i < grantResults.length; i++) {
//檢查權(quán)限是否被拒絕
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
Toast.makeText(SplashActivity.this, "本應(yīng)用需要申請(qǐng)讀寫(xiě)sdcard權(quán)限來(lái)訪問(wèn)本地文件", Toast.LENGTH_SHORT).show();
return;
}
}
break;
}
Intent intent = new Intent(SplashActivity.this,MainActivity.class);
startActivity(intent);
finish();
}
3.要注意這個(gè)方法亲茅,用戶允許或拒絕返回值的類型
/**
* 用戶第一次拒絕后回铛,下一次,返回true克锣,應(yīng)該提示用戶為什么需要這個(gè)權(quán)限茵肃,添加說(shuō)明
* 用戶第二次請(qǐng)求權(quán)限時(shí),用戶拒絕了袭祟,并選擇了不再提醒验残,返回false
* 設(shè)備的策略禁止當(dāng)前應(yīng)用獲取這個(gè)權(quán)限的授權(quán),返回false
*
* 注意:第二次請(qǐng)求權(quán)限時(shí)候才有選項(xiàng)“不再提醒”巾乳,如果用戶一直拒絕您没,但沒(méi)有選擇不再提醒鸟召,下次請(qǐng)求權(quán)限時(shí)候,
* 會(huì)繼續(xù)有不再提醒的權(quán)限
*/
@Override
public boolean shouldShowRequestPermissionRationale(String permission) {
return super.shouldShowRequestPermissionRationale(permission);
}
以上就是Google官方的權(quán)限申請(qǐng)方法氨鹏,這里總結(jié)下實(shí)際使用時(shí)候需要的注意點(diǎn):
1.只請(qǐng)求你需要的權(quán)限:減少請(qǐng)求的次數(shù)欧募,或用intent來(lái)代替,讓其他的應(yīng)用來(lái)處理仆抵。
防止一次請(qǐng)求太多的權(quán)限或請(qǐng)求次數(shù)太多跟继,用戶可能對(duì)你的應(yīng)用感到厭煩。
2.在應(yīng)用啟動(dòng)的時(shí)候镣丑,最好先請(qǐng)求應(yīng)用必須的一些權(quán)限舔糖,不是必須的,在使用的時(shí)候莺匠,才請(qǐng)求(如一些附帶權(quán)限)金吗,需要自己整理,管理一下自己應(yīng)用的權(quán)限分類:
2.1 普通權(quán)限(normal permissions):只需要在androidmanifest.xml中聲明相應(yīng)的權(quán)限趣竣,在安裝應(yīng)用時(shí)辽聊,會(huì)默認(rèn)獲得許可。并且用戶不能修改權(quán)限許可期贫。(只需要在AndroidManifest.xml中簡(jiǎn)單聲明這些權(quán)限就好跟匆,安裝時(shí)就授權(quán)。不需要每次使用 時(shí)都檢查權(quán)限通砍,而且用戶不能取消以上授權(quán)玛臂。)
2.2 需要申請(qǐng)的權(quán)限(dangerous permissions):
2.2.1 必要權(quán)限:最好在應(yīng)用啟動(dòng)的時(shí)候,進(jìn)行請(qǐng)求許可的一些權(quán)限(主要是應(yīng)用中主要功能需要的權(quán)限)
2.2.2 附帶權(quán)限:不是應(yīng)用主要功能需要的權(quán)限(如:分享圖片時(shí)封孙,需要讀取應(yīng)用的通訊錄等等)
3.解釋你的應(yīng)用為什么需要這些權(quán)限:在請(qǐng)求之前requestPermissions().迹冤,提示用戶,讓用戶不會(huì)感到困惑
問(wèn)題持續(xù)收集與回答
小伙伴們嗨起來(lái)