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

28

当用户被要求授予权限时,是否可以提供自定义文本以替换系统对话框?

2个回答

29
不,您不能自定义对话框的文本,但是在请求权限之前,您可以提供解释。引用自developer.android.com:
“如果您的应用程序需要在应用程序清单中列出的危险权限,则必须要求用户授予权限。Android提供了几种方法用于请求权限。调用这些方法会弹出标准的 Android 对话框,您无法自定义。”
在某些情况下,您可能希望帮助用户了解为什么需要某个权限。例如,如果用户启动摄影应用程序,用户可能不会感到惊讶,该应用程序要求使用相机权限,但是用户可能不理解为什么应用程序需要访问用户的位置或联系人。在请求权限之前,您应该考虑向用户提供解释。请记住,您不希望用太多的解释来压倒用户; 如果您提供太多的解释,用户可能会发现应用程序很烦人并将其删除。
您可能使用的一种方法是:仅在用户已经拒绝该权限请求时才提供解释。如果用户不断尝试使用需要权限的功能,但是不断拒绝权限请求,那么这可能表明用户不理解为什么应用程序需要该权限才能提供该功能。在这种情况下,最好显示解释。
为了帮助找到用户可能需要解释的情况,Android提供了一个实用程序方法,即shouldShowRequestPermissionRationale()。 如果应用程序先前请求过此权限并且用户拒绝了请求,则此方法返回true。

1
解释在用户拒绝权限之后,而不是之前。 - Chandler

15

我们无法自定义请求权限对话框,但我们可以为用户提供一个自定义的解释,说明我们为什么需要请求以下是使用自定义解释的方法

   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();
    }
}

以上方法检查是否已授予权限,如果没有,则检查该方法是否需要自定义解释。

ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接