如何获取ActivityCompat.requestPermissions函数的调用响应?
获取ActivityCompat.requestPermissions的权限请求响应
当你调用ActivityCompat.requestPermissions()发起定位权限请求后,系统会通过重写onRequestPermissionsResult()方法返回请求结果,具体实现步骤如下:
1. 重写权限结果回调方法
在你的Activity或Fragment中,重写onRequestPermissionsResult(),通过请求码REQUEST_LOCATION匹配当前请求,然后判断权限是否被授予:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // 匹配你发起请求时传入的REQUEST_LOCATION请求码 if (requestCode == REQUEST_LOCATION) { // 验证权限数组和结果数组的有效性 if (permissions.length > 0 && grantResults.length > 0) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限授予成功:执行定位相关逻辑 // 示例:initLocationManager(); } else { // 权限被拒绝:处理拒绝后的逻辑 handlePermissionDenied(); } } } }
2. 处理权限拒绝的细分场景
权限被拒绝分为两种情况,需分别处理:
- 用户单纯拒绝权限(未勾选"不再询问"):可提示用户权限的必要性
- 用户勾选"不再询问"后拒绝:需引导用户前往应用设置页手动开启权限
实现handlePermissionDenied()方法:
private void handlePermissionDenied() { if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { // 用户勾选了"不再询问",引导至应用设置页 Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri appUri = Uri.fromParts("package", getPackageName(), null); settingsIntent.setData(appUri); startActivity(settingsIntent); } else { // 仅拒绝权限,未勾选"不再询问",提示用户权限用途 Toast.makeText(this, "需要定位权限才能获取当前位置,请重新授权", Toast.LENGTH_SHORT).show(); } }
注意事项
- 确保
REQUEST_LOCATION是你定义的全局常量(比如private static final int REQUEST_LOCATION = 1001;),避免请求码冲突 - 在Android 13及以上版本,若应用需要后台定位,还需额外申请
ACCESS_BACKGROUND_LOCATION权限,但当前请求的ACCESS_FINE_LOCATION按上述逻辑处理即可
内容的提问来源于stack exchange,提问作者Vans
相关产品推荐
相关产品推荐

