Android - 正确的方法来处理必须授予应用程序工作的危险权限吗?

时间:2017-06-23 14:52:32

标签: android permissions android-ndk

由于我们正在处理的数据大小,我的应用程序需要访问存储 - 只是为了读取一些OBB数据。根据定义,这被Android归类为“危险”许可,这是正确的,因此对于Android 6.0,我们需要在应用程序启动时请求它才能执行任何操作。

问题在于,当应用程序从根本上要求它通过主菜单执行任何操作时,用户可以拒绝我们该权限。

处理用户在运行时拒绝授予“危险”权限的情况的正确方法是什么,如果没有它,应用程序几乎没有特色?

编辑:澄清我知道我需要执行此操作的代码以及所涉及的回调。代码示例不是必需的。我需要知道如果不断拒绝会使我的应用程序瘫痪到摇滚的有用性,我应该怎么做。错误然后杀了应用程序?当用户尝试执行任何操作时,显示带有消息的主菜单? 值得注意的是,这是一个本机应用程序,因此C ++正在回调java来执行此操作。

4 个答案:

答案 0 :(得分:2)

其他答案中尚未描述的关键位是在用户拒绝提供权限之后,建议的方法是显示理由对话框,说明您的权限必不可少的原因。有一个兼容性帮助程序可以跟踪此内部状态:

    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

        new AlertDialog.Builder(this)
                .setTitle(R.string.title_my_permission)
                .setMessage(R.string.text_my_permission)
                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        //Prompt the user once explanation has been shown
                        ActivityCompat.requestPermissions(MainActivity.this,
                                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                MY_PERMISSIONS_REQUEST_TAG);
                    }
                })
                .create()
                .show();
    } else {
        // probably first time, request permission
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                MY_PERMISSIONS_REQUEST_TAG);
    }

然而,您应该注意到用户始终处于控制之下,并且可能决定永远不会授予您的应用所需的权限,因此您需要在尽可能多的语言环境中使用一些文本,因为您可以设法说服他们: - )< / p>

更糟糕的是,他们可以在原始请求对话框中选择“永不再问”。在这种情况下,ActivityCompat.shouldShowRequestPermissionRationale也会返回false。如果您真的想要,可以使用第三个对话框警告用户。但是,在这种情况下,用户自己必须在Android设置活动中手动启用权限。您可以使用意图帮助他们找到此活动,但他们必须在选择“永不再询问”后手动检查权限。

答案 1 :(得分:0)

如果这样开始你可以请求许可:

    if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

        } else {
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, RC_WRITE_EXTERNAL_STORAGE);
        }
    }

如果未授予权限,则会显示一个对话框以授予您可以获得结果的权限:

  @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode ==  RC_WRITE_EXTERNAL_STORAGE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        }
    }

答案 2 :(得分:0)

希望这个答案有所帮助: https://stackoverflow.com/a/40142454/4819445

您可以在onRequestPermissionsResult()

内处理

答案 3 :(得分:0)

步骤1: - 在最明显的文件中添加此权限

 android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
 android.Manifest.permission.READ_EXTERNAL_STORAGE,

第2步:询问运行时权限

String permission = android.Manifest.permission.READ_EXTERNAL_STORAGE;
        if (ActivityCompat.checkSelfPermission(MainActivity.this, permission)!= PackageManager.PERMISSION_GRANTED ) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]
                    {permission}, PERMISSION_CODE);

        }

第3步:处理永久性结果

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                   @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_CODE) {
    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {


        Toast.makeText(this, "permission_granted_msg", Toast.LENGTH_SHORT).show();

    } else {

        Toast.makeText(this, "permission_not_granted_msg", Toast.LENGTH_SHORT).show();
    }
}

}