为Android M权限对话框提供自定义文本

rfs*_*010 23 android android-permissions android-6.0-marshmallow

是否可以为系统对话框提供自定义文本,该对话框在要求用户授予权限时显示?

Mat*_*ini 26

不,您无法自定义对话框的文本,但可以在请求权限之前提供说明.引自developer.android.com:

请求权限

如果您的应用需要应用清单中列出的危险权限,则必须要求用户授予权限.Android提供了几种可用于请求权限的方法.调用这些方法会打开一个标准的Android对话框,您无法自定义该对话框.

解释为什么应用需要权限

在某些情况下,您可能希望帮助用户了解您的应用需要权限的原因.例如,如果用户启动摄影应用程序,则用户可能不会对应用程序请求使用摄像头的许可感到惊讶,但是用户可能不理解应用程序想要访问用户的位置或联系人的原因.在您申请许可之前,您应该考虑向用户提供说明.请记住,您不希望用解释来压倒用户; 如果您提供太多解释,用户可能会发现应用程序令人沮丧并将其删除.

您可能使用的一种方法是仅在用户已拒绝该权限请求时提供说明.如果用户不断尝试使用需要权限的功能,但不断拒绝权限请求,则可能表明用户不理解为什么应用程序需要提供该功能的权限.在这种情况下,显示解释可能是个好主意.

为了帮助找到用户可能需要解释的情况,Android提供了一个实用方法, shouldShowRequestPermissionRationale().如果应用先前已请求此权限且用户拒绝该请求,则此方法返回true.


ran*_*dam 11

我们无法自定义请求权限对话框,但我们可以为用户提供一个自定义说明,说明我们在下面请求的是具有自定义说明的方法

   private void checkForCameraPermission() {
    // Here, thisActivity is the current activity
    if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
            AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
            alertBuilder.setCancelable(true);
            alertBuilder.setTitle("Camera permission necessary");
            alertBuilder.setMessage("FITsociety need camera permission to read barcode.");
            alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    ActivityCompat.requestPermissions(BarCodeScannerActivity.this,
                            new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);
                }
            });

            AlertDialog alert = alertBuilder.create();
            alert.show();
        } else {
            // No explanation needed, we can request the permission.
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA},
                    MY_PERMISSIONS_REQUEST_CAMERA);
            // MY_PERMISSIONS_REQUEST_CAMERA is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    } else {
        setBarCodeScannerView();
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的方法检查是否已经授予权限,如果没有,则检查此方法是否需要自定义说明

ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)
Run Code Online (Sandbox Code Playgroud)

此方法的文档在这里shouldShowRequestPermissionRationale()此方法仅在用户拒绝权限对话框或用户关闭应用程序设置的权限时才返回true,如果用户这样做,则显示带有自定义说明的警告对话框并继续进行希望它的工作原理