由于我们正在处理的数据大小,我的应用程序需要访问存储 - 只是为了读取一些OBB数据。根据定义,这被Android归类为“危险”许可,这是正确的,因此对于Android 6.0,我们需要在应用程序启动时请求它才能执行任何操作。
问题在于,当应用程序从根本上要求它通过主菜单执行任何操作时,用户可以拒绝我们该权限。
处理用户在运行时拒绝授予“危险”权限的情况的正确方法是什么,如果没有它,应用程序几乎没有特色?
编辑:澄清我知道我需要执行此操作的代码以及所涉及的回调。代码示例不是必需的。我需要知道如果不断拒绝会使我的应用程序瘫痪到摇滚的有用性,我应该怎么做。错误然后杀了应用程序?当用户尝试执行任何操作时,显示带有消息的主菜单? 值得注意的是,这是一个本机应用程序,因此C ++正在回调java来执行此操作。
答案 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();
}
}
}