如何再次询问权限?

How Does Permission get asked Again?

我正在寻求将我的 SQLite 数据库复制到 "external" 存储,作为备份我的数据库文件的一种方式。用户可以从那里获取 .db 文件并移动到认为安全的地方。

Android Developer documentation on getting permission 到 WRITE_EXTERNAL_STORAGE 之后,我逐字输入了显示的代码,并使用调试器逐步执行了它。 (我把 READ_CONTACTS 改成了 WRITE_EXTERNAL_STORAGE)

它将首先checkSelfPermission并跳过shouldShowRequestPermissionRationalerequestPermissions。然后我会收到一个警告弹出窗口,要求我的许可。

如果我拒绝它,它将在第二次 运行 通过时,再次转到 checkSelfPermission 然后转到 shouldShowRequestPermissionRationale 但跳过 requestPermissions 并终止不询问再次申请许可,正如 Android 文档所说的那样。

我的问题:

  1. 我是否应该在 shouldShowRequestPermissionRationale[=47] 中添加对 requestPermissions 的调用=] if() 阻止让它再次询问?或者有别的办法吗?
  2. 如果我想解释为什么需要权限的原因或理由,我是否应该实现自己的 AlertDialog 框?或者有没有设置方法再问我还没发现的AlertBox来给系统提供我的解释?

到目前为止,我在编写此应用程序时所做的一切都是一种学习经历。我玩得很开心。

编辑:我有

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"  />

在我的 Manafest 中设置。

在基本原理回调中,您应该调用与以前相同的逻辑,只是添加一个用户应该真的、真的允许此权限的原因:-)显示一个 Toast 或者可能是一个 AlertDialog然后再次触发权限请求。如果您选择对话框,请在用户关闭 Dialog.

后请求许可

如果用户再次拒绝,您不应再次请求。用户可能最终决定要通过“设置”启用它,但通常他们认为您不应该获得许可:-(

1- 如果 on the second run through 你的意思是用户在几秒钟前被拒绝了你的许可请求,根据你的实现你不需要在 [=12= 中调用 requestPermissions ] if() 直接阻塞,因为用户曾经拒绝过你的请求,你应该尊重 his/her 的决定。如果 shouldShowRequestPermissionRationale 返回真值,您可以简单地显示一些 dialog/toast 或一个 snackbar 来向用户解释为什么您需要此权限,并且您可以提供一些方法在 dialog/snackbar 中再次请求权限,例如,一个 grant access 按钮再次调用 requestPermissions 但由于用户单击它是基于用户请求并且不会在 if() 块内自动触发。如果 shouldShowRequestPermissionRationale 返回 false,您只需更改您的应用程序的进程,使其可以在没有该权限的情况下继续运行,例如停止或显示禁用的视图,让用户知道由于 his/her 决定允许此功能不再可用。

2- 您应该根据应用程序的设计在 自定义用户界面 视图上显示用户请求权限的原因。您可以使用警报对话框或小吃店。警告对话框很常见,但由于它们会阻止其他 UI 元素,因此从用户体验的角度来看,它们不会被建议。

您可以查看 google here and here 提供的示例源。 我建议看看这个 and 和它的第一条评论,这可能会让你有一个很好的理解。

如何再次请求权限?

简答:再问一遍。

一些解释:你可以提供一个警告对话框或其他东西来说明你为什么需要这个权限,也不需要每次都这样做,因为用户可以知道哪个权限是否需要取决于操作,但是,我使用了一种方法来检查权限,它看起来像:

public class CheckPermissions {


public static boolean hasPermission(int PERMISSION_REQUEST, String permission, Context context) {
    if (ContextCompat.checkSelfPermission(context,
            permission)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context,
                permission)&&
                ContextCompat.checkSelfPermission(context,
                        permission)
                        != PackageManager.PERMISSION_GRANTED){

            return false;

        } else {

            ActivityCompat.requestPermissions((Activity) context,
                    new String[]{permission},
                    PERMISSION_REQUEST);

        }

        return false;
    } else {
        return true;


       }
    }
}

所以您可以随时检查。

 if (CheckPermissions.hasPermission(PERMISSION_REQUEST, Manifest.permission.YOUR_PERMISSION, context)){
// do some thing
}