正我是搞了老半天才发现的 openSetting拉起设置界面打开某一项拒绝授权的权限时,必须在拉起这项权限的 authorize 函数中的 fail 函数 中使用openSetting函数,且使用这个函数也必须使用一个confirm 方法进行包裹提示!!
时间: 2024-10-10 21:13:16 浏览: 26
小程序授权拒绝后重新拉起授权窗口
正确定义应用程序权限请求流程时,在Android开发中,当你尝试获取用户对特定功能的访问权限,比如读取联系人或者发送短信,如果用户之前已经拒绝过,通过`ActivityCompat.requestPermissions()`方法会直接失败。在这种情况下,你需要在`onRequestPermissionsResult()`方法的`else if (requestCode == MY_PERMISSIONS_REQUEST_READ_CONTACTS && grantResults[0] == PackageManager.PERMISSION_DENIED)`这样的条件分支里,调用`startActivityForResult()`启动一个`SettingsActivity`,让用户明确地再次选择是否授予权限。
具体步骤如下:
1. 定义一个常量,如`MY_PERMISSIONS_REQUEST_READ_CONTACTS`,用于标识请求码。
2. 当用户第一次拒绝权限时,创建一个Intent,指向`Settings`应用中的相应权限设置页面:
```java
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
```
3. 使用`startActivityForResult()`方法启动这个Intent,并传入请求码,这样当用户返回时,系统会回调到`onActivityResult()`。
4. 在`onActivityResult()`方法中,检查结果并处理用户的决策,通常会在`fail`部分添加类似下面的代码:
```java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == MY_PERMISSIONS_REQUEST_READ_CONTACTS && resultCode == RESULT_CANCELED) {
// 用户取消了权限请求,这里可以显示提示或者进一步操作
Toast.makeText(this, "权限已关闭,需要手动开启", Toast.LENGTH_SHORT).show();
}
}
```
5. 最后,记得在`fail`里的`Toast`或其他提示里包含`startActivityForResult()`的确认提示,让用户明白下一步是什么操作。
阅读全文