1、这是一些动态验证权限的方法
/** * 该方法是用来检查是否具有照相机的权限。 * Android6.0之后的手机,动态请求。之前的直接跳转到设置界面。 */ public int checkHaveCameraPermission(Activity activity) { int i = checkHavePermissions(activity, Manifest.permission.CAMERA); return i; } /** * 该方法是用来检查是否具有录音的权限。 * Android6.0之后的手机,动态请求。之前的直接跳转到设置界面。 */ public int checkHaveRecordAudioPermission(Activity activity) { int i = checkHavePermissions(activity, Manifest.permission.RECORD_AUDIO); return i; } /** * 是否有读取内存的权限 * * @param activity * @return */ public int checkHaveExternalStoragePermission(Activity activity) { int i = checkHavePermissions(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); return i; } /** * 是否有获取位置的权限 * * @param activity * @return */ public int checkHaveLocationPermission(Activity activity) { int i = checkHavePermissions(activity, Manifest.permission.ACCESS_FINE_LOCATION); return i; } /** * 是否有获取手机状态的权限 * * @param activity * @return */ public int checkHaveReadPhoneStatePermission(Activity activity) { int i = checkHavePermissions(activity, Manifest.permission.READ_PHONE_STATE); return i; } /** * 是否有华为的WRITE_SETTINGS全新 * * @param activity * @return */ public int checkHaveWriteSettingPermission(Activity activity) { int i = checkHavePermissions(activity, Manifest.permission.WRITE_SETTINGS); return i; } /** * 该方法用来请求是否具备某些权限。当前先不对外提供,以后有其他权限请求在对外提供 */ private int checkHavePermissions(Activity activity, String permission) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 检查该权限是否已经获取 int i = ContextCompat.checkSelfPermission(activity, permission); return i; } return PackageManager.PERMISSION_GRANTED; }
2、这是点击按钮时候,需要先动态验证权限的代码内容。
/** * 请求相机权限 */ private final int REQUEST_PERMISSION_CAMERA = 2; /** * 请求录音的权限 */ private final int REQUEST_PERMISSION_RECORD_AUDIO = 3; /** * 请求存储权限 */ private final int REQUEST_PERMISSION_READ_EXTERNAL_STORAGE = 4;......
int cameraPermission = AppUtils.getUtils().checkHaveCameraPermission(mActivity); if (cameraPermission != PackageManager.PERMISSION_GRANTED) { //没有相机权限,请求相机权限 ActivityCompat.requestPermissions(ClasszoneActivity.this, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA); return; } int recordAudioPermission = AppUtils.getUtils().checkHaveRecordAudioPermission(mActivity); if (recordAudioPermission != PackageManager.PERMISSION_GRANTED) { //没有录音权限,请求录音权限 ActivityCompat.requestPermissions(ClasszoneActivity.this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_PERMISSION_RECORD_AUDIO); return; } int externalStoragePermission = AppUtils.getUtils().checkHaveExternalStoragePermission(mActivity); if (externalStoragePermission != PackageManager.PERMISSION_GRANTED) { //没有存储权限,请求存储权限 ActivityCompat.requestPermissions(ClasszoneActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION_READ_EXTERNAL_STORAGE); return; } ......点击后的后续操作,或者不是点击其他的逻辑处理 3、然后需要重写activity的onRequestPermissionResult()方法进行处理,防止部分用户选择了不在弹出请求权限对话框的操作。
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_PERMISSION_CAMERA: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请) boolean b = shouldShowRequestPermissionRationale(permissions[0]); if (!b) { // 用户还是想用我的 APP 的 // 提示用户去应用设置界面手动开启权限 AppUtils.getUtils().showDialogTipUserGoToAppSettting( ClasszoneActivity.this, getString(R.string.openCameraPermission)); } else { // finish(); } } else { AppUtils.getUtils().alertCommonText(getString(R.string.getPermissionSuccess)); } } break; case REQUEST_PERMISSION_READ_EXTERNAL_STORAGE: //请求存储权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请) boolean b = shouldShowRequestPermissionRationale(permissions[0]); if (!b) { // 用户还是想用我的 APP 的 // 提示用户去应用设置界面手动开启权限 AppUtils.getUtils().showDialogTipUserGoToAppSettting( ClasszoneActivity.this, getString(R.string.openExternalPermission)); } else { // finish(); } } else { AppUtils.getUtils().alertCommonText(getString(R.string.getPermissionSuccess)); } } break; case REQUEST_PERMISSION_RECORD_AUDIO: //录音 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请) boolean b = shouldShowRequestPermissionRationale(permissions[0]); if (!b) { // 用户还是想用我的 APP 的 // 提示用户去应用设置界面手动开启权限 AppUtils.getUtils().showDialogTipUserGoToAppSettting( ClasszoneActivity.this, getString(R.string.openRadioPermission)); } else { // finish(); } } else { AppUtils.getUtils().alertCommonText(getString(R.string.getPermissionSuccess)); } } break; default: break; } }注:
1、AppUtils.getUtils().showDialogTipUserGoToAppSettting( ClasszoneActivity.this, getString(R.string.openRadioPermission));
该方法是弹出对话框,让用户是否去选择跳转进入到手机的设置页面进行权限的开启。
该方法是跳转到手机权限设置界面,部分手机可能不适合,需要再想办法
/** * 跳转到权限设置界面 */ public void jumpAppDetailSettingIntent(Context activity) { // vivo 点击设置图标>加速白名单>我的app // 点击软件管理>软件管理权限>软件>我的app>信任该软件 Intent appIntent = activity.getPackageManager().getLaunchIntentForPackage("com.iqoo.secure"); if (appIntent != null) { activity.startActivity(appIntent); // floatingView = new SettingFloatingView(this, "SETTING", activity.getApplication(), 0); // floatingView.createFloatingView(); return; } // // // oppo 点击设置图标>应用权限管理>按应用程序管理>我的app>我信任该应用 // // activity>自启动管理>我的app appIntent = activity.getPackageManager().getLaunchIntentForPackage("com.oppo.safe"); if (appIntent != null) { activity.startActivity(appIntent); // floatingView = new SettingFloatingView(this, "SETTING", activity.getApplication(), 1); // floatingView.createFloatingView(); return; } Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= 9) { intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", activity.getPackageName(), null)); } activity.startActivity(intent); }2、
AppUtils.getUtils().alertCommonText(getString(R.string.getPermissionSuccess));是我自定义的弹出toast的方法。