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

Posted

技术标签:

【中文标题】为 Android M 权限对话框提供自定义文本【英文标题】:Provide custom text for Android M permission dialog 【发布时间】:2016-01-01 18:34:04 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

请求权限

如果您的应用需要应用中列出的危险权限 manifest,它必须要求用户授予权限。安卓 提供了几种可用于请求权限的方法。打电话 这些方法会打开一个标准的 Android 对话框,而您不能 自定义。

说明应用需要权限的原因

在某些情况下,您可能希望帮助用户了解原因 您的应用需要权限。例如,如果用户启动一个 摄影应用程序,用户可能不会对该应用程序感到惊讶 请求使用相机的权限,但用户可能不会 了解应用为什么要访问用户的位置或 联系人。在您请求许可之前,您应该考虑 向用户提供解释。记住你不想要 用解释压倒用户;如果你提供太多 解释,用户可能会发现应用程序令人沮丧并删除它。

您可能使用的一种方法是仅在以下情况下提供解释 用户已经拒绝了该权限请求。如果用户保持 尝试使用需要许可但保留的功能 拒绝权限请求,这可能表明用户 不明白为什么应用程序需要提供该权限 功能。在这种情况下,可能是个好主意 给出解释。

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

【讨论】:

解释是用户拒绝权限之后,而不是之前【参考方案2】:

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

   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,如果用户这样做,则显示带有自定义说明的警报对话框并继续希望它有效

【讨论】:

以上是关于为 Android M 权限对话框提供自定义文本的主要内容,如果未能解决你的问题,请参考以下文章

自定义选择器活动:SecurityException UID n 没有对 content:// uri 的权限

对话框“不再询问”的 Android M 权限问题

Android M 权限:onRequestPermissionsResult() 未在自定义按钮类中调用

Android IME:显示一个自定义弹出对话框(如 Swype 键盘),可以在 TextView 中输入文本

如何自定义对话框的标题布局

Android自定义DialogFragment问题[重复]