首先,您需要在您的Activity
中实现OnRequestPermissionsResultCallback
监听器接口,这是ActivityCompat
类提供的。然后,重写void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
方法,以检查用户是否允许或拒绝权限。
您可以像这样实现。在这里,我检查了WRITE_EXTERNAL_STORAGE
权限的访问:
int REQUEST_STORAGE = 1;
private void checkPermissions() {
if (hasStoragePermissionGranted()) {
// you can do whatever you want
} else {
requestPermission();
}
}
public boolean hasPermissionGranted(){
return ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
public void requestPermission() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_STORAGE);
}
}
当用户从运行时权限对话框中允许或拒绝权限时,onRequestPermissionsResult()
方法将被调用。
您还可以处理用户已选中“不再询问”运行时权限对话框的情况。为此,您可以显示Snackbar或按钮,以将用户重定向到您的应用程序设置页面,因为在用户勾选“不再询问”后,您无法显示权限对话框。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == REQUEST_STORAGE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Storage permission is enabled
canSendAttachments = true;
systemLogsCheckbox.setEnabled(true);
} else if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivtity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//User has deny from permission dialog
Snackbar.make(mainLayout, getResources().getString("Please enable storage permission"),
Snackbar.LENGTH_INDEFINITE)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_STORAGE);
}
})
.show();
} else {
// User has deny permission and checked never show permission dialog so you can redirect to Application settings page
Snackbar.make(mainLayout, getResources().getString("Please enable permission from settings"),
Snackbar.LENGTH_INDEFINITE)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
})
.show();
}
}
}
在这里,我使用了Snackbar
来向用户显示有关权限的相关信息,而mainLayout
是Activity主布局
的ID。
希望对您有所帮助。
我创建了一个库
,可以帮助您处理所有的权限
。您可以在这里找到它:
回答您的问题:
为了知道用户是否勾选
了“不再显示”,您需要检查两个条件:如果权限被拒绝
且无需解释
,如果这两个条件都返回**true**
,那么该权限将不再可用,唯一的解决方案是打开设置屏幕。
P.S:我创建的库可以为您处理所有这些情况,并返回回调以让您决定下一步要做什么!该库有两种实现方式:
当用户选择“不再询问”时,请打开您的应用程序设置。
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
步骤1:使用PermissionsDispatcher库,作者是hotchemi(该库基于注释,易于使用且文档完善)
步骤2:您需要提供4个带注释的方法之一是@OnNeverAskAgain(Manifest.permission.[permission_you_want]),如下所示
@OnNeverAskAgain(Manifest.permission.[permission_you_want])
void showNeverAsk() {
// handle here
}
这里是示例