哈哈照棋,現(xiàn)在寫適配6.0好像有點(diǎn)馬后炮的感覺(jué),不過(guò)以前確實(shí)沒(méi)有注意到這些問(wèn)題武翎。前幾天在添加高德地圖定位功能的時(shí)候發(fā)現(xiàn)在Android 6.0系統(tǒng)上有很多的權(quán)限需要進(jìn)行動(dòng)態(tài)申請(qǐng)烈炭。
下面先來(lái)看一下在Android 6.0中都有哪些權(quán)限需要我們來(lái)進(jìn)行動(dòng)態(tài)申請(qǐng)權(quán)限的。
以上就是在Android 6.0系統(tǒng)中需要?jiǎng)討B(tài)授權(quán)的危險(xiǎn)權(quán)限表宝恶,在剛實(shí)習(xí)面試的時(shí)候曾經(jīng)被問(wèn)到過(guò)一個(gè)問(wèn)題符隙,Android 6.0中需要?jiǎng)討B(tài)授權(quán)的權(quán)限一共有多少個(gè)... 當(dāng)時(shí)也是被問(wèn)的一臉懵逼,只是知道概念垫毙,從來(lái)沒(méi)有實(shí)踐過(guò)霹疫。所以也借助這個(gè)機(jī)會(huì)加深一下印象,一共是9組27個(gè)權(quán)限综芥,當(dāng)我們?cè)趧?dòng)態(tài)授權(quán)時(shí)丽蝎,只要用戶允許了一組當(dāng)中的一個(gè)權(quán)限,那么系統(tǒng)默認(rèn)會(huì)通過(guò)整組的權(quán)限膀藐,所以我們?cè)趧?dòng)態(tài)授權(quán)時(shí)每組只要將一個(gè)permission進(jìn)行授權(quán)即可屠阻。
注意:焓 !栏笆!在Android O中已經(jīng)修復(fù)此項(xiàng)类腮,系統(tǒng)只會(huì)授予應(yīng)用明確請(qǐng)求的權(quán)限。
下面來(lái)看一下如何在代碼中實(shí)現(xiàn)動(dòng)態(tài)授權(quán):
- 首先蛉加,個(gè)人建議將以下的動(dòng)態(tài)授權(quán)代碼放在自己項(xiàng)目的SplashActivity中蚜枢,這樣用戶第一次啟動(dòng)應(yīng)用的時(shí)候,最先就能進(jìn)行授權(quán)针饥,避免影響程序在之后的運(yùn)行厂抽,而且這樣一來(lái)可以進(jìn)行統(tǒng)一授權(quán)。
當(dāng)項(xiàng)目中有多個(gè)危險(xiǎn)權(quán)限需要?jiǎng)討B(tài)申請(qǐng)時(shí)丁眼,見(jiàn)以下代碼:
// 聲明一個(gè)數(shù)組筷凤,用來(lái)存儲(chǔ)所有需要?jiǎng)討B(tài)申請(qǐng)的權(quán)限
String[] permissions = new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,};
// 聲明一個(gè)集合,在后面的代碼中用來(lái)存儲(chǔ)用戶拒絕授權(quán)的權(quán)
List<String> mPermissionList = new ArrayList<>();
- checkPermission() 調(diào)用我們寫好的檢查權(quán)限方法
private void checkPermission() {
mPermissionList.clear();
/**
* 判斷哪些權(quán)限未授予
* 以便必要的時(shí)候重新申請(qǐng)
*/
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permission);
}
}
/**
* 判斷存儲(chǔ)委授予權(quán)限的集合是否為空
*/
if (!mPermissionList.isEmpty()) {
// 后續(xù)操作...
} else {//未授予的權(quán)限為空苞七,表示都授予了
// 后續(xù)操作...
}
}
- 回調(diào)動(dòng)態(tài)授權(quán)結(jié)果
boolean mShowRequestPermission = true;//用戶是否禁止權(quán)限
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
//判斷是否勾選禁止后不再詢問(wèn)
boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(ShopNearbyActivity.this, permissions[i]);
if (showRequestPermission) {
// 后續(xù)操作...
} else {
// 后續(xù)操作...
}
}
}
// 授權(quán)結(jié)束后的后續(xù)操作...
break;
default:
break;
}
}
只要能理解上面的代碼藐守,基本上就可以完成對(duì)Android 6.0以上版本中需要的動(dòng)態(tài)授權(quán)操作。
新人上路蹂风,如果各位萌友發(fā)現(xiàn)什么問(wèn)題卢厂,歡迎一起交流學(xué)習(xí)哦,也希望大神們可以多多指教~