车载应用访问位置、麦克风和摄像头需要哪些特殊权限?

解读

车载 Android 并非普通手机场景,主机厂(OEM)在 AOSP 之上叠加了 CarService、CarPermission、SystemUI 定制以及整车 ECU 网关策略。面试官想确认两点:

  1. 你是否知道 Android 10 以后“常规敏感权限”与“后台特权权限”的区分;
  2. 你是否理解车载项目还必须过 OEM 的“预装白名单”与“驾驶安全策略”两道关,否则即使 AndroidManifest 里写满 uses-permission 也会被系统静默拒绝。

因此,回答时要把“Android 原生权限”和“车载额外权限”分层说清楚,并给出国内主流座舱平台(华为 AOS、吉利 GOS、小鹏 XPU、比亚迪 DiLink)常见的加固方案。

知识点

  1. 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。
  2. 车载专用权限

    • 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。
  3. 驾驶安全策略(国内 OEM 强管控)

    • 车速 > 5 km/h 时,SystemUI 会强制拒绝 CAMERA_OPEN、MIC_RECORD,即使已有权限;
    • 麦克风数据必须走车载音频 HAL,禁止直接打开底层 “/dev/snd/pcmC0D0c” 绕过 AudioFlinger;
    • 摄像头预览流必须接进 CarService 的 DriverDistractionListener,由 SystemUI 统一遮罩。
  4. 国内合规要求

    • 收集车外行人人脸、车牌需做匿名化,否则通不过《汽车数据安全管理若干规定》第 6 条;
    • 录音超过 1 分钟必须弹窗提示并允许用户一键关闭,否则应用市场会被下架。

答案

  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 时系统会强制返回空位置。

  2. 麦克风
    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 直接拒绝。

  3. 摄像头
    AndroidManifest 静态声明:
    android.permission.CAMERA
    车载额外权限:
    android.permission.SYSTEM_CAMERA (仅系统相机可拿到外参标定数据)
    若应用需要在行车时打开摄像头,必须向 SystemUI 申请 CarPackageManager.setDriverDistractionOptimization(true),并提交安全测试报告给 OEM,审核通过后由 SystemUI 在状态栏显示“摄像头正在工作”图标,否则 CameraService 会抛出 CameraAccessException:SECURITY_ERROR。

一句话总结:车载场景下,先拿到 Android 原生危险权限,再进 OEM 白名单,最后通过驾驶安全策略,三层全部绿灯,位置、麦克风、摄像头才真正可用。

拓展思考

  1. 如果项目既要录音又要降噪,如何证明没有留存原始语音?
    建议把 AudioRecord 的回调直接接进车载音频 HAL 的 EchoReference,输出端只保留降噪后 PCM,并在隐私合规文档中给出“原始数据零落盘”的抓包证明。

  2. 副驾娱乐屏与主驾仪表共用同一颗摄像头,如何防止副驾应用把画面投到仪表?
    利用 Android 13 的 Camera2 API 新特性 CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA,把摄像头拆成 logicalCamera1(副驾)、logicalCamera2(仪表),并在 CarService 的 CameraAccessPolicy 里按 uid 绑定,副驾应用只能打开 logicalCamera1,系统层禁止跨逻辑相机重定向。

  3. 未来 Google 推广 Android for Cars OS(AAOS 14),权限模型可能引入“汽车风险权限组”(Automotive Risk Permissions),届时后台录音、行车录像将统一走 Google Play 托管的“汽车敏感权限审核”,国内 OEM 如何提前适配?
    可以提前把权限调用封装到独立 aar 模块,通过 OEM 签名做接口级兜底,一旦 AAOS 强制上架审核,只需替换模块内的权限检查路径,无需改动业务代码。