车载应用访问位置、麦克风和摄像头需要哪些特殊权限?
解读
车载 Android 并非普通手机场景,主机厂(OEM)在 AOSP 之上叠加了 CarService、CarPermission、SystemUI 定制以及整车 ECU 网关策略。面试官想确认两点:
- 你是否知道 Android 10 以后“常规敏感权限”与“后台特权权限”的区分;
- 你是否理解车载项目还必须过 OEM 的“预装白名单”与“驾驶安全策略”两道关,否则即使 AndroidManifest 里写满 uses-permission 也会被系统静默拒绝。
因此,回答时要把“Android 原生权限”和“车载额外权限”分层说清楚,并给出国内主流座舱平台(华为 AOS、吉利 GOS、小鹏 XPU、比亚迪 DiLink)常见的加固方案。
知识点
-
Android 10+ 权限分级
- 普通权限(normal):安装即授予。
- 危险权限(dangerous):需要动态申请,用户可拒绝。
- 后台特权权限(background access):Android 10 起后台获取位置需单独申请 ACCESS_BACKGROUND_LOCATION;后台启动麦克风/摄像头会被系统直接拦截,除非拿到前台 Service 或特殊白名单。
- 签名/系统权限(signature|privileged):只有预装到 /system/priv-app 且与系统签名一致才能持有,如 android.permission.CAMERA_DISABLE_TRANSMIT、android.permission.RECORD_AUDIO_PRIVILEGED。
-
车载专用权限
- android.car.permission.CAR_INFO:读取 VIN、车速、档位。
- android.car.permission.CAR_CONTROL_AUDIO_VOLUME:接管车载音量。
- android.car.permission.CAR_ENERGY:读取剩余电量/油量。
- 以上权限在 manifest 声明后,还需在 /system/etc/permissions/oem-car-whitelist.xml 中显式放行,否则 CarService 会 throw SecurityException。
-
驾驶安全策略(国内 OEM 强管控)
- 车速 > 5 km/h 时,SystemUI 会强制拒绝 CAMERA_OPEN、MIC_RECORD,即使已有权限;
- 麦克风数据必须走车载音频 HAL,禁止直接打开底层 “/dev/snd/pcmC0D0c” 绕过 AudioFlinger;
- 摄像头预览流必须接进 CarService 的 DriverDistractionListener,由 SystemUI 统一遮罩。
-
国内合规要求
- 收集车外行人人脸、车牌需做匿名化,否则通不过《汽车数据安全管理若干规定》第 6 条;
- 录音超过 1 分钟必须弹窗提示并允许用户一键关闭,否则应用市场会被下架。
答案
-
位置
AndroidManifest 静态声明:
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
若 targetSdk≥29 且需要后台定位,额外申请:
android.permission.ACCESS_BACKGROUND_LOCATION
车载侧还需把包名写进 /system/etc/permissions/oem-car-whitelist.xml,并在 CarService 的 LocationPolicy 中注册为“导航级应用”,否则车速 >5 km/h 时系统会强制返回空位置。 -
麦克风
AndroidManifest 静态声明:
android.permission.RECORD_AUDIO
车载项目如要“免弹窗”预授权,必须把 APK 预装到 /system/priv-app,并在 oem-car-whitelist.xml 中加入:
<privapp-permissions package="com.xxx.xxx">
<permission name="android.permission.RECORD_AUDIO"/>
</privapp-permissions>
同时实现一个继承自 androidx.core.app.NotificationCompat 的前台 Service,调用 startForegroundService(),否则后台录音会被 CarAudioService 直接拒绝。 -
摄像头
AndroidManifest 静态声明:
android.permission.CAMERA
车载额外权限:
android.permission.SYSTEM_CAMERA (仅系统相机可拿到外参标定数据)
若应用需要在行车时打开摄像头,必须向 SystemUI 申请 CarPackageManager.setDriverDistractionOptimization(true),并提交安全测试报告给 OEM,审核通过后由 SystemUI 在状态栏显示“摄像头正在工作”图标,否则 CameraService 会抛出 CameraAccessException:SECURITY_ERROR。
一句话总结:车载场景下,先拿到 Android 原生危险权限,再进 OEM 白名单,最后通过驾驶安全策略,三层全部绿灯,位置、麦克风、摄像头才真正可用。
拓展思考
-
如果项目既要录音又要降噪,如何证明没有留存原始语音?
建议把 AudioRecord 的回调直接接进车载音频 HAL 的 EchoReference,输出端只保留降噪后 PCM,并在隐私合规文档中给出“原始数据零落盘”的抓包证明。 -
副驾娱乐屏与主驾仪表共用同一颗摄像头,如何防止副驾应用把画面投到仪表?
利用 Android 13 的 Camera2 API 新特性 CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA,把摄像头拆成 logicalCamera1(副驾)、logicalCamera2(仪表),并在 CarService 的 CameraAccessPolicy 里按 uid 绑定,副驾应用只能打开 logicalCamera1,系统层禁止跨逻辑相机重定向。 -
未来 Google 推广 Android for Cars OS(AAOS 14),权限模型可能引入“汽车风险权限组”(Automotive Risk Permissions),届时后台录音、行车录像将统一走 Google Play 托管的“汽车敏感权限审核”,国内 OEM 如何提前适配?
可以提前把权限调用封装到独立 aar 模块,通过 OEM 签名做接口级兜底,一旦 AAOS 强制上架审核,只需替换模块内的权限检查路径,无需改动业务代码。