我的应用需要访问存储 - 只是要读取一些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();
}
}
}