逻辑根据公司业务来
- 相关的权限必须写在一组数组里头 成功与失败以组为单位,
- 申请组里任何一个权限失败 都以导向失败逻辑
- 文件清单写好权限
/**
* 已授权、未授权的接口回调
*/
public interface PermissionListener {
int what = -1;
void onGranted(List<String> grantedPermission);//已授权
void onShouldShow(List<String> shouldShowPermission);//已授权
void onDenied(List<String> deniedPermission);//未授权
}
基于BaseActivity
protected PermissionListener mListener;//实例对象来自BaseActivity的实现类
protected final int PERMISSION_REQUESTCODE = 100;
//基类处理子类要申请权限操作
protected void requestRunPermisssion(String[] permissions, PermissionListener listener) {
mListener = listener;
if (Build.VERSION.SDK_INT >= 23) {//6.0以上
//收纳授权不成功
List<String> deniedpermissionLists = new ArrayList<>();
//收纳授权成功的
List<String> grantedPermissions = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
deniedpermissionLists.add(permission);
} else {
LogUtils.i("ALIYUN", false, permissions + " 默认申请好了 ");
grantedPermissions.add(permission);
}
}
//相关的权限必须写在一组数组里头 成功与失败以组为单位,
//申请组里任何一个权限失败 都以导向失败逻辑
if (!deniedpermissionLists.isEmpty()) {
//以下逻辑处理结果在onRequestPermissionsResult();
//将失败权限再次弹框确认
ActivityCompat.requestPermissions(
this,
deniedpermissionLists.toArray(new String[deniedpermissionLists.size()]),
PERMISSION_REQUESTCODE);
} else {
//已经申请好的权限 这个if可以去掉 if(!grantedPermissions.isEmpty())
if (!grantedPermissions.isEmpty()) {
//表示全授权了
mListener.onGranted(grantedPermissions);
}
}
} else {
//6.0以下默认申请好了
mListener.onGranted(Arrays.asList(permissions));
}
}
//系统回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUESTCODE:
if (grantResults.length > 0) {
LogUtils.i("ALIYUN", false, "返回再次申请的权限:" + Arrays.asList(permissions));
List<String> deniedPermissions = new ArrayList<>();//收纳授权不成功
List<String> grantedPermissions = new ArrayList<>();//收纳授权成功
List<String> showShoudPermissions = new ArrayList<>();//收纳勾选禁止后不再询问弹框后的权限
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
deniedPermissions.add(permissions[i]);
//判断选择了denied状态权限时是否勾选了禁止不再询问
boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i]);
if (!showRequestPermission) {
//以下权限不会再次弹框询问
LogUtils.i("ALIYUN", false, permissions[i] + " 权限勾选不再询问");
showShoudPermissions.add(permissions[i]);
}
} else {
grantedPermissions.add(permissions[i]);
}
}
//分别回调各自的函数
if (!grantedPermissions.isEmpty()) {
//都授权的 才回调onGranted
if (grantedPermissions.size() == permissions.length) {
mListener.onGranted(grantedPermissions);
}
}
if (!deniedPermissions.isEmpty()) {
//没有授权的权限
mListener.onDenied(deniedPermissions);
}
if (!showShoudPermissions.isEmpty()) {
mListener.onShouldShow(showShoudPermissions);
}
}
break;
default:
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}实现类将需要申请的权限放入一个集合 调用基类的requestRunPermisssion(……)方法即可,建议相关一组的权限单独放入一个集合,逻辑上判断了 数组中只要其中一个权限被拒绝了,默认都会整组权限失败,但是下次申请 ,不会再弹申请成功的某个权限,这样保准执行某个权限动作 会得到所有权限认可