如何再次询问权限?

时间:2018-03-06 20:25:56

标签: android file backup android-permissions android-external-storage

我正在寻求将我的SQLite数据库复制到“外部”存储,以备份我的数据库文件。用户可以从那里获取.db文件并移动到一个安全的地方。

Android Developer documentation on getting permission到WRITE_EXTERNAL_STORAGE之后,我输入了逐字显示的代码,然后我用调试器逐步完成了它。 (我将READ_CONTACTS更改为WRITE_EXTERNAL_STORAGE)

首先 checkSelfPermission 并跳过 shouldShowRequestPermissionRationale 转到 requestPermissions 即可。然后我会收到一个警告弹出窗口,要求我的许可。

如果我否认它,那么在第二次运行时,它将再次转到 checkSelfPermission ,然后转到 shouldShowRequestPermissionRationale 但跳过 requestPermissions 并终止不再请求权限,因为Android文档说它应该。

我的问题:

  1. 我是否应该在 shouldShowRequestPermissionRationale if()块中添加对 requestPermissions 的调用以获取它再问一次?或者还有另一种方式吗?
  2. 如果我想解释为什么需要权限的原因或理由,我是否应该实现自己的AlertDialog框?或者是否有一个set方法再次询问AlertBox我还没有发现系统提供我的解释?
  3. 到目前为止,我在编写此应用程序时所做的一切都是学习经验。我玩的很开心。

    编辑:我确实有

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

    在我的Manafest中设置。

3 个答案:

答案 0 :(得分:0)

在基本原理回调中,你应该调用与以前相同的逻辑,只是添加一个用户应该真正的理由,真正允许这个权限:-)显示Toast或者AlertDialog然后再次触发权限请求。如果您转到对话框,请在用户取消Dialog后请求权限。

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

答案 1 :(得分:0)

1-如果on the second run through表示您的用户在几秒钟前被拒绝了您的许可请求,则根据您的实施情况,您无需在requestPermissions内拨打shouldShowRequestPermissionRationale ()直接阻止,因为用户拒绝了您的请求一次,您应该尊重他/她的决定。如果shouldShowRequestPermissionRationale返回true值,您只需显示一些对话框/吐司或快餐栏来向用户解释您需要此权限的原因,并且您可以提供一些方法在该对话框/快餐栏内再次请求权限,例如{ {1}}按钮再次调用grant access,但由于用户点击它是基于用户请求,并且不会在if()块内自动触发。如果requestPermissions返回false,您只需更改应用程序的进程,使其可以在没有该权限的情况下继续进行,例如停止或显示禁用的视图以让用户知道因为他/她的权限决定此功能不是可以了。

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

您可以查看Google herehere提供的示例来源。 我建议您查看此questionits answer及其第一条可能会让您了解更多的评论。

答案 2 :(得分:0)

如何再次询问许可?

简答:是再次询问。

一些解释:您可以提供警告对话框或其他内容来说明您需要此权限的原因,也不需要每次都这样做,因为用户可以知道需要哪个权限依赖于操作,但是,有一种方法我用来检查权限,它看起来像:

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
}