ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 的区别是什么?
解读
在国内 Android 面试中,这道题几乎必问,因为它同时考察了「权限模型」「定位原理」「隐私合规」三条主线。面试官想听的不是“一个精一个粗”这么简单,而是:
- 两种权限在 AndroidManifest 中的声明差异;
- 对系统定位服务(Fused Location Provider、基站、Wi-Fi、GNSS)的调用路径差异;
- 国内无 GMS 环境下,高德、百度、华为等定位 SDK 如何映射这两种权限;
- 工信部 164 号文、《个人信息保护法》对“粗略”“精确”定位的合规要求;
- 运行时弹窗文案与“用户可仅授权粗略」场景下的降级策略。
答出“权限等级+精度+功耗+合规+降级方案”五个维度,才能拿到高分。
知识点
-
权限级别
ACCESS_FINE_LOCATION 属于 dangerous 权限,group=LOCATION;ACCESS_COARSE_LOCATION 同属 dangerous,但精度标记为“coarse”。两者可单独申请,也可同时申请;若已授予精确,系统默认已隐含粗略。 -
精度指标
官方文档定义:- fine:典型误差 ≤ 50 m,实际依赖 GNSS+RTT+视觉融合,可达 3~5 m;
- coarse:典型误差 1
3 km,仅允许使用基站、Wi-Fi 扫描结果,禁止调用 GNSS 硬件。800 m,郊区 1~2 km。
国内厂商实测: coarse 在高楼林立城区约 200
-
系统服务行为
无 GMS 机型:LocationManager.requestLocationUpdates() 传 provider=“fused” 时,若仅持有 coarse 权限,系统会自动降级为“passive”+“network” 组合,屏蔽 GPS 芯片;若持有 fine,则允许启用“gps”provider。
有 GMS 机型:FusedLocationProviderClient 内部通过 LocationRequest.setPriority() 区分,应用仍须声明对应权限,否则直接 SecurityException。 -
功耗差异
仅持有 coarse 时,GNSS 射频不工作,功耗降低 30~50 mA;对后台定位场景,Android 12+ 的“Approximate location” 选项可把每小时电量消耗从 180 mAh 降到 60 mAh 左右,是国内后台保活整治的重点。 -
合规与审核
应用商店(华为、OPPO、vivo、小米、应用宝)自 2022 年起强制区分“粗略/精确”使用目的:- 若功能场景为“本地新闻”“天气预报”,只能申请 coarse;
- 若场景为“导航”“运动轨迹”,才允许申请 fine,并在隐私政策中用加粗字体告知。
工信部抽检发现“声明 coarse 实际调用 fine” 直接下架。
-
代码差异
// 仅粗略 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PERMISSION_GRANTED) { fusedClient.getCurrentLocation(Priority.PRIORITY_BALANCED_POWER_ACCURACY, null) } // 精确 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PERMISSION_GRANTED) { fusedClient.getCurrentLocation(Priority.PRIORITY_HIGH_ACCURACY, null) }注意:即使 priority=HIGH,若清单只有 coarse,系统仍抛 SecurityException。
答案
ACCESS_FINE_LOCATION 允许应用通过 GNSS、Wi-Fi RTT、视觉定位等手段获取误差 50 m 以内的“精确”位置,功耗高、隐私敏感;ACCESS_COARSE_LOCATION 仅允许使用基站和 Wi-Fi 扫描获取 1~3 km 级别的“粗略”位置,功耗低、合规宽松。两者都是运行时危险权限,但精确权限隐含粗略能力;在 Android 12+ 用户可仅授权粗略,应用必须做好降级策略以满足国内商店和工信部合规要求。
拓展思考
- 折叠屏/多窗口场景下,同一应用在前屏申请 fine、副屏仅需要 coarse,如何基于 ViewModel+ActivityResultContracts.Permission 实现“权限按窗口粒度降级”?
- 国内无 GMS 车载系统,车载 HAL 把 GNSS 数据封装成“vehicle GPS”属性,应用仍需 coarse/fine 权限才能读取,如何写一段 SystemUI 级别的权限预授权脚本,既满足车规安全,又让第三方导航 APK 免弹窗?
- 如果用户只给了 coarse,而导航功能必须 fine,产品经理要求“30 天内用弹窗提醒转化≥60%”,如何结合工信部“明示同意”条款设计弹窗文案与频次,避免被商店下架?