Android-正确处理危险许可的正确方法,必须授予应用程序才能正常工作



我的应用需要访问存储 - 只是要读取一些OBB数据 - 由于我们要处理的数据大小。根据定义,这是Android归类为"危险"许可,因此,正如Android 6.0一样,我们需要在应用程序开始之前要求它。

问题是,当应用程序从根本上要求它在主菜单上做任何事情时,用户可以拒绝我们的权限。

处理用户拒绝在运行时授予"危险"许可的情况的正确方法是什么?

编辑:要澄清我知道我需要执行此操作的代码以及所涉及的回调。不需要代码样本。,如果恒定拒绝会使我的应用程序削弱我的应用程序,我需要知道该怎么办。错误然后杀死该应用程序?当用户尝试执行任何操作时,显示带有消息的主菜单?也可能值得注意的是,这是一个本机应用程序,因此C 正在回到Java进行此操作。

其他答案中尚未描述的是在用户拒绝提供许可之后,推荐的方法是显示一个理由对话框,解释为什么说明为什么您的许可是必不可少的。有一个跟踪此内部状态的兼容助手:

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

您应该注意,用户始终处于控制状态,并且可能决定永远不会授予您的应用程序所需的许可,因此您需要在尽可能多的地方进行一些文字,以免说服他们: - (

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

您可以在这样启动时要求许可:

    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) {
        }
    }

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

您可以在onRequestPermissionsResult()

内处理该操作

步骤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:处理Permiion结果

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

}

最新更新