Android位置权限:如何获取用户选择的权限选项?
如何获知Android位置权限弹窗的用户选择
在Android中,要区分用户对位置权限弹窗的三个选项(使用应用期间、仅本次允许、不允许),可以通过以下两种主流方式实现:
一、使用Jetpack Activity Result API(推荐)
这是Google推荐的现代权限请求方式,替代了旧的onRequestPermissionsResult回调,代码更简洁且生命周期安全。
实现步骤
- 在Activity或Fragment中注册权限请求启动器:
val locationPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> when { isGranted -> { // 权限被允许,进一步区分类型 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { val permissionFlags = packageManager.getPermissionFlags( Manifest.permission.ACCESS_FINE_LOCATION, packageName, android.os.Process.myUid() ) if (permissionFlags and PackageManager.FLAG_PERMISSION_TEMPORARY_GRANTED != 0) { // 用户选择了「仅本次允许」 } else { // 用户选择了「使用应用期间」 } } else { // Android 10及以下无「仅本次允许」选项,对应「使用应用期间」 } } else -> { // 权限被拒绝,判断是否勾选了「不再询问」 val shouldShowRationale = shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION) if (!shouldShowRationale) { // 用户选择「不允许」并勾选了「不再询问」 } else { // 用户仅选择「不允许」,未勾选「不再询问」 } } } }
- 发起权限请求:
locationPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)
二、旧版onRequestPermissionsResult回调(兼容低版本)
如果项目仍在使用旧的权限请求逻辑,可以通过重写onRequestPermissionsResult方法处理结果:
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1001; // 发起权限请求 requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE); // 处理回调结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限允许 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { int flags = getPackageManager().getPermissionFlags( Manifest.permission.ACCESS_FINE_LOCATION, getPackageName(), android.os.Process.myUid() ); if ((flags & PackageManager.FLAG_PERMISSION_TEMPORARY_GRANTED) != 0) { // 仅本次允许 } else { // 使用应用期间 } } else { // 使用应用期间 } } else { // 权限拒绝 boolean shouldShowRationale = shouldShowRequestPermissionRationale(permissions[0]); if (!shouldShowRationale) { // 用户选择「不允许」并勾选「不再询问」 } else { // 用户仅选择「不允许」 } } } }
关键区分逻辑说明
- 「使用应用期间」:权限为永久授予状态(直到用户在系统设置中修改),Android 10+下
FLAG_PERMISSION_TEMPORARY_GRANTED标志不存在。 - 「仅本次允许」:仅当前应用会话有效,应用重启后权限会被自动收回,Android 10+下可通过
FLAG_PERMISSION_TEMPORARY_GRANTED标志识别。 - 「不允许」:权限被拒绝,若
shouldShowRequestPermissionRationale返回false,说明用户同时勾选了「不再询问」选项。
内容的提问来源于stack exchange,提问作者Luong Truong
相关产品推荐
相关产品推荐

