【威哥說】去年互订,Google升級6.0后吱肌,很重要的一點是權(quán)限的改變,到現(xiàn)在很多總結(jié)分析權(quán)限的文章仰禽,但是或者不太詳細(xì)氮墨,或者有疏漏,下面我來給大家來總結(jié)下6.0權(quán)限的問題吐葵。
1.這個新的運行時權(quán)限僅當(dāng)我們設(shè)置targetSdkVersion ?23(這意味著你已經(jīng)在23上測試通過了)才起作用规揪,當(dāng)然還要是M系統(tǒng)的手機。app在6.0之前的設(shè)備依然使用舊的權(quán)限系統(tǒng)温峭。
如果app的targetSdkVersion 低于 23猛铅,那將被認(rèn)為app沒有用23新權(quán)限測試過,那將被繼續(xù)使用舊有規(guī)則:用戶在安裝的時候不得不接受所有權(quán)限凤藏,安裝后app就有了那些權(quán)限咯奸忽!然后app像以前一樣奔跑堕伪!注意,此時用戶依然可以取消已經(jīng)同意的授權(quán)月杉!用戶取消授權(quán)時刃跛,android 6.0系統(tǒng)會警告,但這不妨礙用戶取消授權(quán)苛萎。
問題又來了,這時候你的app崩潰嗎检号?
善意的主把這事也告訴了android小組腌歉,當(dāng)我們在targetSdkVersion 低于23的app調(diào)用一個需要權(quán)限的函數(shù)時,這個權(quán)限如果被用戶取消授權(quán)了的話齐苛,不拋出異常翘盖。但是他將啥都不干,結(jié)果導(dǎo)致函數(shù)返回值是null或者0.
2.代碼沒有成功改為支持最新運行時權(quán)限的app,不要設(shè)置targetSdkVersion 23 發(fā)布凹蜂,否則你就有麻煩了馍驯。只有當(dāng)你測試過了,再改為targetSdkVersion 23 玛痊。
警告:現(xiàn)在你在android studio新建項目汰瘫,targetSdkVersion 會自動設(shè)置為 23。如果你還沒支持新運行時權(quán)限擂煞,我建議你首先把targetSdkVersion 降級到22
3.權(quán)限組:
同一組的任何一個權(quán)限被授權(quán)了混弥,其他權(quán)限也自動被授權(quán)。例如对省,一旦WRITE_CONTACTS被授權(quán)了蝗拿,app也有READ_CONTACTS和GET_ACCOUNTS了。
權(quán)限分組官方表格如下:
下面我們來看具體的使用方法:
1.請求要申請的權(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.請求后的回調(diào)方法蒿涎,根據(jù)返回的結(jié)果碼執(zhí)行操作
//動態(tài)權(quán)限申請后系統(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)用需要申請讀寫sdcard權(quán)限來訪問本地文件", Toast.LENGTH_SHORT).show();
return;
}
}
break;
}
Intent intent = new Intent(SplashActivity.this,MainActivity.class);
startActivity(intent);
finish();
}
3.要注意這個方法哀托,用戶允許或拒絕返回值的類型
/**
* 用戶第一次拒絕后,下一次劳秋,返回true仓手,應(yīng)該提示用戶為什么需要這個權(quán)限,添加說明
* 用戶第二次請求權(quán)限時俗批,用戶拒絕了俗或,并選擇了不再提醒,返回false
* 設(shè)備的策略禁止當(dāng)前應(yīng)用獲取這個權(quán)限的授權(quán)岁忘,返回false
*
* 注意:第二次請求權(quán)限時候才有選項“不再提醒”辛慰,如果用戶一直拒絕,但沒有選擇不再提醒干像,下次請求權(quán)限時候帅腌,
* 會繼續(xù)有不再提醒的權(quán)限
*/
@Override
public boolean shouldShowRequestPermissionRationale(String permission) {
return super.shouldShowRequestPermissionRationale(permission);
}
以上就是Google官方的權(quán)限申請方法驰弄,這里總結(jié)下實際使用時候需要的注意點:
1.只請求你需要的權(quán)限:減少請求的次數(shù),或用intent來代替速客,讓其他的應(yīng)用來處理戚篙。
防止一次請求太多的權(quán)限或請求次數(shù)太多,用戶可能對你的應(yīng)用感到厭煩溺职。
2.在應(yīng)用啟動的時候岔擂,最好先請求應(yīng)用必須的一些權(quán)限,不是必須的浪耘,在使用的時候乱灵,才請求(如一些附帶權(quán)限),需要自己整理七冲,管理一下自己應(yīng)用的權(quán)限分類:
2.1 普通權(quán)限(normal permissions):只需要在androidmanifest.xml中聲明相應(yīng)的權(quán)限痛倚,在安裝應(yīng)用時,會默認(rèn)獲得許可澜躺。并且用戶不能修改權(quán)限許可蝉稳。(只需要在AndroidManifest.xml中簡單聲明這些權(quán)限就好,安裝時就授權(quán)掘鄙。不需要每次使用 時都檢查權(quán)限耘戚,而且用戶不能取消以上授權(quán)。)
2.2 需要申請的權(quán)限(dangerous permissions):
2.2.1 必要權(quán)限:最好在應(yīng)用啟動的時候通铲,進(jìn)行請求許可的一些權(quán)限(主要是應(yīng)用中主要功能需要的權(quán)限)
2.2.2 附帶權(quán)限:不是應(yīng)用主要功能需要的權(quán)限(如:分享圖片時毕莱,需要讀取應(yīng)用的通訊錄等等)
3.解釋你的應(yīng)用為什么需要這些權(quán)限:在請求之前requestPermissions().,提示用戶颅夺,讓用戶不會感到困惑
問題持續(xù)收集與回答
小伙伴們嗨起來