兜兜零元 发表于 2024-7-15 09:44:51

Android 动态权限申请 | 2次不允许权限导致申请权限不再弹框

一、题目描述

Android 14平台,录音应用须要申请麦克风权限,点击录音按钮时间会先检测是否有麦克风权限,如果有则直接开始录音,否则申请麦克风权限,当用户测试时间2次出现权限申请弹框都都选择不允许,第三次次就不再权限申请弹框。
https://img-blog.csdnimg.cn/direct/7bda0a07ab7b46608d1dca1e1d42d68a.png
二、题目分析

这里须要引入一个方法ActivityCompat.shouldShowRequestPermissionRationale(activity, permission),大部分应用申请动态权限时,都没有用这个做判定是否应该弹框,系统默认是返回true,但用户拒绝并不再询问或者2次不允许,此时就会不停返回false。
shouldShowRequestPermissionRationale() 是 Android 系统中的一个 API,用于查抄用户是否应该看到权限哀求解释. 当您第一次哀求一个危险权限时,系统会主动体现一个解释对话框,阐明该权限的用途以及为什么您的应用须要它。
shouldShowRequestPermissionRationale() 方法可以资助您确定是否应该再次体现该解释对话框。 该方法会返回一个 boolean 值:


[*]true: 表示用户应该看到权限哀求解释。
[*]false: 表示用户不应该看到权限哀求解释。
    /**
   * Gets whether you should show UI with rationale for requesting a permission.
   * You should do this only if you do not have the permission and the context in
   * which the permission is requested does not clearly communicate to the user
   * what would be the benefit from granting this permission.
   * <p>
   * For example, if you write a camera app, requesting the camera permission
   * would be expected by the user and no rationale for why it is requested is
   * needed. If however, the app needs location for tagging photos then a non-tech
   * savvy user may wonder how location is related to taking photos. In this case
   * you may choose to show UI with rationale of requesting this permission.
   * </p>
   *
   * @param activity The target activity.
   * @param permission A permission your app wants to request.
   * @return Whether you can show permission rationale UI.
   *
   * @see #checkSelfPermission(android.content.Context, String)
   * @see #requestPermissions(android.app.Activity, String[], int)
   */
    public static boolean shouldShowRequestPermissionRationale(@NonNull Activity activity,
            @NonNull String permission) {
      if (Build.VERSION.SDK_INT >= 23) {
            return activity.shouldShowRequestPermissionRationale(permission);
      }
      return false;
    }
   获取是否应体现 UI 以及哀求权限的来由。仅当您没有该权限而且哀求权限的上下文无法清楚地向用户传达授予此权限有何好处时,您才应实行此操作
当哀求权限被拒绝时,如果只是平凡的拒绝,调用这个方法的返回值是true;如果是“拒绝并不再询问”或者2次不允许,则返回值是false,意思是这时都不停拒绝了,不须要体现哀求权限来由了,这个时间调用requestPermissions去申请权限时就不会在出现权限弹框了。
三、解决方案

在 Android 中,应用程序须要申请 RECORD_AUDIO 权限才能使用设备的麦克风进行录音。以下是申请 RECORD_AUDIO 权限的代码示例:
1. 在 AndroidManifest.xml 文件中声明权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
2. 在代码中查抄权限:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
    // 权限未授权,请求权限
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUSET_CODE);
} else {
    // 权限已授权,可以开始录音
    // ...
}
3. 处理权限哀求效果:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
      case FmUtils.REQUSET_CODE:
            if (permissions.length > 0) {
                for (int i = 0; i < permissions.length; i++) {
                  if (grantResults.length > 0 && grantResults != PackageManager.PERMISSION_GRANTED) {
                        // 权限授权失败
                        if (ActivityCompat.shouldShowRequestPermissionRationale(RecordingActivity.this, permission)) {
                            // 返回 true,Toast 提示
                            Toast.makeText(this, "无法访问麦克风,请授权后再试", Toast.LENGTH_SHORT).show();
                        } else {
                            // 返回 false,需要显示对话框引导跳转到设置手动授权
                            showDialog(RecordingActivity.this);
                        }
                        return;
                  }
                }
                // 权限授权成功,可以开始录音
                // ...
            }
            break;
      default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}
4. 引导用户跳转到APP设置界面:
public static void showDialog(final Activity activity) {
      AlertDialog.Builder builder = new AlertDialog.Builder(activity);
      Resources resources = activity.getResources();
      builder.setMessage(resources.getString(R.string.setting_permission_content));
      builder.setNegativeButton(resources.getString(R.string.cancel),
                (dialog, which) -> {
                  dialog.dismiss();
                });
      builder.setPositiveButton(activity.getString(R.string.setting_permission),
                (dialog, which) -> {
                  dialog.dismiss();
                  Intent settingsIntent = new Intent();
                  settingsIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                  settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                  settingsIntent.setData(Uri.parse("package:" + activity.getPackageName()));
                  activity.startActivity(settingsIntent);
                });
      builder.setCancelable(false);
      builder.show();
}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Android 动态权限申请 | 2次不允许权限导致申请权限不再弹框