之前我在讲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();