Android 多權(quán)限動態(tài)申請的優(yōu)化
最近,在看其他項目代碼中挺物,發(fā)現(xiàn)多權(quán)限的申請方法懒浮,有缺陷,判斷是只判斷的其中一個是否有權(quán)限姻乓,這就有問題嵌溢,另外,失敗的話蹋岩,是全部返回失敗赖草,并沒有得到到底哪一個失敗了。所以自己完善優(yōu)化下多權(quán)限申請剪个。
/**
* 多權(quán)限申請
* @param permissions 權(quán)限組
* @param messageRes 提示語組
*/
public void checkPermissions(String[] permissions, @StringRes int[] messageRes, PermissionCallBack callBack) {
this.mPermissionCallBack = callBack;
List<String> needPermissions = new ArrayList<>();
needPermissions = getDeniedPermissions(permissions,messageRes);
if(needPermissions == null||needPermissions.size() == 0){
//已經(jīng)擁有授權(quán)
callBack.onSuccess();
} else {
ActivityCompat.requestPermissions(this, needPermissions.toArray(new String[needPermissions.size()]),
BaseConfig.ACTION_PERMISSIONS_REQUEST);
}
}
/**
* 獲得權(quán)限組需要申請的權(quán)限
* @param permissions
* @param messageRes
* @return
*/
public List<String> getDeniedPermissions(String[] permissions, @StringRes int[] messageRes) {
List<String> needRequestPermissionList = new ArrayList<>();
// 檢查是否已經(jīng)具有權(quán)限
for (int i = 0; i<permissions.length;i++) {
if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
needRequestPermissionList.add(permissions[i]);
}
}
return needRequestPermissionList;
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case BaseConfig.ACTION_PERMISSIONS_REQUEST: {
List<String> refusedPermissions = new ArrayList<>();
if (grantResults.length > 0 && verifyPermissions(grantResults)) {
// 全部授權(quán)操作
if (mPermissionCallBack != null) {
mPermissionCallBack.onSuccess();
}
} else {
// 多權(quán)限返回哪個是被拒絕
for(int i = 0;i<permissions.length;i++){
if(grantResults[i] != PackageManager.PERMISSION_GRANTED)
refusedPermissions.add(permissions[i]);
}
//權(quán)限沒能授權(quán)通過秧骑,可以考慮彈個toast告訴用戶
if (mPermissionCallBack != null) {
mPermissionCallBack.onFailed(refusedPermissions);
}
}
break;
}
default:
break;
}
}
/**
* 確認(rèn)所有的權(quán)限是否都已授權(quán)
*
* @param grantResults
* @return
*/
private boolean verifyPermissions(int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
方法如何使用
checkPermissions(permissions,messageRes, new PermissionCallBack() {
@Override
public void onSuccess() {
// 操作獲得手機(jī)權(quán)限后的方法
// 開啟定位
}
@Override
public void onFailed(List<String> refusedPermissions) {
boolean isRefusedPhone = false,isRefusedLocation = false;
for(String refusedPermission : refusedPermissions) {
if (refusedPermission.equals(Manifest.permission.ACCESS_FINE_LOCATION)) {
isRefusedLocation = true;
} else if(refusedPermission.equals(Manifest.permission.READ_PHONE_STATE)){
isRefusedPhone = true;
}
}
if(!isRefusedPhone) {
// 操作獲得手機(jī)權(quán)限后的方法
}
if(!isRefusedLocation) {
// 開啟定位
}
}
});