之前我在讲Android6.0危险权限列表和安卓各版本市场占有率及特性有讲有关于开发安卓6.0以上版本的项目时每次调用到有危险权限都要动态申请,这反反复复的操作造成了大量的代码冗余,以下是我自定义封装动态申请权限的方法。
我在BaseActivity建立以下方法:
private PermissionListener mListener;//已授权、未授权的接口回调
private static final int PERMISSION_REQUESTCODE = 11;//动态申请权限的码
/* --------------------------- 动态申请权限 ----------------------------- */
public void requestRunPermisssion(String[] permissions, PermissionListener listener) {
mListener = listener;
List<String> permissionLists = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
permissionLists.add(permission);
}
}
if (!permissionLists.isEmpty()) {
ActivityCompat.requestPermissions(this, permissionLists.toArray(new String[permissionLists.size()]), PERMISSION_REQUESTCODE);
} else {
//表示全都授权了
mListener.onGranted();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case PERMISSION_REQUESTCODE:
if (grantResults.length > 0) {
//存放没授权的权限
List<String> deniedPermissions = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
int grantResult = grantResults[i];
String permission = permissions[i];
if (grantResult != PackageManager.PERMISSION_GRANTED) {
deniedPermissions.add(permission);
}
}
if (deniedPermissions.isEmpty()) {
//说明都授权了
mListener.onGranted();
} else {
mListener.onDenied(deniedPermissions);
}
}
break;
default:
break;
}
}
/*提醒用户不开通权限的后果*/
public void msg_one() {
//当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置
new AlertDialog.Builder(this)
.setTitle("警告")
.setMessage("需要开启权限才能使用此功能")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引导用户到设置中去进行设置
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", getPackageName(), null));
startActivity(intent);
}
})
.setNegativeButton("取消", null)
.create()
.show();
}
/**
* 已授权、未授权的接口回调
*/
public interface PermissionListener {
void onGranted();//已授权
void onDenied(List<String> deniedPermission);//未授权
}
在所需的地方调用
/*申请地图权限*/
private void askForPermission() {
requestRunPermisssion(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, new PermissionListener() {
@Override
public void onGranted() {
//执行相应的地图操作
}
@Override
public void onDenied(List<String> deniedPermission) {
String s = "被拒绝的权限:";
for (String permission : deniedPermission) {
s += permission + "\n";
}
Toast.makeText(LocationActivity.this, s, Toast.LENGTH_SHORT).show();
//提示用户到系统去设置权限
msg_one();
}
});
}
第三方封装动态申请权限
https://blog.csdn.net/yanzhenjie1003/article/details/52503533
在build.gradle里面添加
implementation 'com.yanzhenjie.permission:support:2.0.1'
AndPermission.with(activity)
.requestCode(100)
.permission(Manifest.permission.WRITE_CONTACTS)
.rationale(...)
.callback(...)
.start();
高版本:
AndPermission.with(this).runtime().permission(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA)
.onDenied(new Action<List<String>>() {
@Override
public void onAction(List<String> data) {
/*同意权限集合*/
Logs.d(Arrays.toString(data.toArray()));
}
})
.onGranted(new Action<List<String>>() {
@Override
public void onAction(List<String> data) {
/*禁止的权限集合*/
Logs.i(Arrays.toString(data.toArray()));
}
}).start();