1 在BaseActivity中添加方法
public void runTimeRequestPermission(final Activity activity, List<String> requestPermissionLists, PermissionCallBack permissionCallBack) {
if (requestPermissionLists.isEmpty()) {
return;
}
mPermissionCallBack = permissionCallBack;
List<String> requestPermissionList = AppUtils.findDeniedPermissions(activity, requestPermissionLists);
if (requestPermissionList.isEmpty() || requestPermissionList.size() <= 0) {
mPermissionCallBack.granted();
} else {
ActivityCompat.requestPermissions(activity, requestPermissionList.toArray(new String[requestPermissionList.size()]), YOUR_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case YOUR_CODE:
if (grantResults.length > 0) {
List<String> deniedPermissionList = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
deniedPermissionList.add(permissions[i]);
}
}
if (deniedPermissionList.isEmpty()||deniedPermissionList.size()<=0) {
mPermissionCallBack.granted();
} else {
mPermissionCallBack.denied(deniedPermissionList);
}
}
break;
default:
break;
}
}
2 在BaseFragment中
public void runTimeRequestPermission(final Activity activity, List<String> requestPermissionLists, PermissionCallBack permissionCallBack) {
if (requestPermissionLists.isEmpty()) {
return;
}
mPermissionCallBack = permissionCallBack;
List<String> requestPermissionList = AppUtils.findDeniedPermissions(activity, requestPermissionLists);
if (requestPermissionList.isEmpty() || requestPermissionList.size() <= 0) {
mPermissionCallBack.granted();
} else {
requestPermissions(requestPermissionList.toArray(new String[requestPermissionList.size()]), YOUR_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case YOUR_CODE:
if (grantResults.length > 0) {
List<String> deniedPermissionList = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
deniedPermissionList.add(permissions[i]);
}
}
if (deniedPermissionList.isEmpty()) {
mPermissionCallBack.granted();
} else {
mPermissionCallBack.denied(deniedPermissionList);
}
}
break;
default:
break;
}
}
3 書寫一個權限申請的回調接口
public interface PermissionCallBack {
/**
* 全部已授權
*/
void granted();
/**
* 未授權權限
* @param permissionList 未授權的權限集合
*/
void denied(List<String> permissions);
}
4 注意事項 參考地址
1. 權限申請儘量是需要的時候纔去進行申請
2. 如果用戶拒絕權限可以進行一些友好提示,避免程序崩潰
3. checkSelfPermission:檢查是否擁有這個權限
4. requestPermissions:請求權限,一般會彈出一個系統對話框,詢問用戶是否開啓這個權限。
5. shouldShowRequestPermissionRationale:Android原生系統中,如果第二次彈出權限申請的對話框,會出現“以後不再彈出”的提示框,如果用戶勾選了,你再申請權限, 則shouldShowRequestPermissionRationale返回true,意思是說要給用戶一個 解釋,告訴用戶爲什麼要這個權限。然而,在實際開發中,需要注意的是,很多手機對原生 系統做了修改,比如小米,小米4的6.0的shouldShowRequestPermissionRationale 就一直返回false,而且在申請權限時,如果用戶選擇了拒絕,則不會再彈出對話框了 所以說這個地方有坑,我的解決方法是,在回調裏面處理,如果用戶拒絕了這個權限,則打開本應用信息界面,由用戶自己手動開啓這個權限。
6. 每個應用都有自己的權限管理界面,裏面有本應用申請的權限以及各種狀態,即使用戶已經同意了你申請的權限,他也隨時可以關閉