【发布时间】:2018-06-08 06:59:21
【问题描述】:
我正在制作一个需要存储权限的应用程序,我使用requestPermission() 请求权限。这使用户有权从设置中关闭它们,但我希望用户知道有必要授予应用程序基本功能的权限。我希望在用户从设置中禁用应用程序权限时显示此警报对话框。那可能吗?
【问题讨论】:
标签: android runtime-permissions
我正在制作一个需要存储权限的应用程序,我使用requestPermission() 请求权限。这使用户有权从设置中关闭它们,但我希望用户知道有必要授予应用程序基本功能的权限。我希望在用户从设置中禁用应用程序权限时显示此警报对话框。那可能吗?
【问题讨论】:
标签: android runtime-permissions
当用户从设置中禁用应用程序权限时 可能吗?
很遗憾,这是不可能的。你无法检测到它。您可以做的最好的事情是在使用需要此权限的功能之前检查权限。
当您的应用处于后台时
显示一条通知,指示缺少权限。当用户点击通知时:
当您的应用处于前台时
您可以展示许可理由以突出许可的重要性。 Android 提供了一个实用方法,shouldShowRequestPermissionRationale(),如果用户之前拒绝了请求,则返回 true。当此方法返回true时,请说明理由。
您从设置屏幕看到对话框的原因
您看到该对话框是因为您要为其禁用权限的应用程序具有targetSDkversion < Android M。系统已启用兼容模式以在安装时授予权限,但由于应用程序的版本与当前操作系统不兼容,因此会警告用户。
【讨论】:
存储许可请求示例
请求许可
private int STORAGE_PERMISSION = 1;
private AlertDialog alertDialog;
if (!(ActivityCompat.checkSelfPermission(LauncherActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
ActivityCompat.requestPermissions(LauncherActivity.this, new
String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION);
}
请求许可后。 Activity 会返回这个方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == STORAGE_PERMISSION && (ActivityCompat.checkSelfPermission(LauncherActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED)){
// when user denied the permission
// show dialog to user that the permission is mandatory and add positiveButton. inside the button recall permission check.
alertDialog();
}
}
负责警告对话框的方法
private void alertDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("your title").setMessage("your message for user to request to accept permissions");
builder.setPositiveButton("Accept", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (!(ActivityCompat.checkSelfPermission(LauncherActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
ActivityCompat.requestPermissions(LauncherActivity.this, new
String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION);
}
}
});
alertDialog = builder.create();
alertDialog.show();
}
【讨论】: