Android Automotive OS 13中AndroidX读取车速权限添加无效求助
Android Automotive OS 13 AVD读取车速权限问题排查
问题描述
在运行Android Automotive OS 13的AVD中,尝试通过AndroidX读取车辆车速信息,使用的极简代码如下:
AutomotiveCarHardwareManager(context).carInfo.addSpeedListener(Executors.newSingleThreadExecutor()) {}
运行时抛出权限缺失异常:
java.lang.RuntimeException: java.lang.SecurityException: Missed permission: android.car.permission.CAR_SPEED
已在AndroidManifest.xml中添加对应权限,但报错无变化(其他通用权限可正常生效):
<uses-permission android:name="android.car.permission.CAR_INFO"/> <uses-permission android:name="android.car.permission.CAR_SPEED"/>
另外无法在代码中导入android.car.permission.CAR_SPEED,查看报错相关源码文件也存在大量导入错误,疑问:是否必须自定义构建才能获取这类车辆特权信息?
完整异常栈:
FATAL EXCEPTION: main Process: com.example.autodemo, PID: 11953 java.lang.RuntimeException: java.lang.SecurityException: Missed permission: android.car.permission.CAR_SPEED at androidx.car.app.utils.RemoteUtils.lambda$dispatchCallFromHost$0(RemoteUtils.java:155) at androidx.car.app.utils.RemoteUtils$$ExternalSyntheticLambda1.run(Unknown Source:6) at androidx.car.app.utils.ThreadUtils.runOnMain(ThreadUtils.java:39) at androidx.car.app.utils.RemoteUtils.dispatchCallFromHost(RemoteUtils.java:147) at androidx.car.app.utils.RemoteUtils.lambda$dispatchCallFromHost$1(RemoteUtils.java:186) at androidx.car.app.utils.RemoteUtils$$ExternalSyntheticLambda2.run(Unknown Source:8) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7924) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) Caused by: java.lang.SecurityException: Missed permission: android.car.permission.CAR_SPEED at androidx.car.app.hardware.common.PropertyManager.checkPermissions(PropertyManager.java:310) at androidx.car.app.hardware.common.PropertyManager.submitRegisterListenerRequest(PropertyManager.java:105) at androidx.car.app.hardware.info.AutomotiveCarInfo.addSpeedListener(AutomotiveCarInfo.java:188) at com.example.autodemo.InfoScreen.onGetTemplate(InfoScreen.kt:69) at androidx.car.app.Screen.getTemplateWrapper(Screen.java:361) at androidx.car.app.ScreenManager.getTopTemplate(ScreenManager.java:279) at androidx.car.app.AppManager$1$$ExternalSyntheticLambda1.dispatch(Unknown Source:2) at androidx.car.app.utils.RemoteUtils.lambda$dispatchCallFromHost$0(RemoteUtils.java:150) at androidx.car.app.utils.RemoteUtils$$ExternalSyntheticLambda1.run(Unknown Source:6) at androidx.car.app.utils.ThreadUtils.runOnMain(ThreadUtils.java:39) at androidx.car.app.utils.RemoteUtils.dispatchCallFromHost(RemoteUtils.java:147) at androidx.car.app.utils.RemoteUtils.lambda$dispatchCallFromHost$1(RemoteUtils.java:186) at androidx.car.app.utils.RemoteUtils$$ExternalSyntheticLambda2.run(Unknown Source:8) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7924) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
问题原因与解决方式
- 权限类型特殊性:
android.car.permission.CAR_SPEED属于签名级权限,这类权限仅授予与系统签名一致的应用,普通第三方应用即使在Manifest中声明也无法获取权限。 - AVD限制:默认的Android Automotive OS AVD面向普通应用开发,未提供获取这类敏感车辆数据的权限通道,即便自定义构建AVD,也需要匹配系统签名才能拿到权限。
- 代码导入问题:无法导入
android.car.permission.CAR_SPEED是因为该权限类属于系统框架层API,普通应用的SDK中不包含,只有系统应用或基于系统源码构建的应用才能访问。
替代方案
如果仅用于开发测试,可以尝试:
- 使用Android Automotive提供的模拟车辆数据工具:通过
adb shell命令手动注入车速等模拟数据,或者利用Car App Library中的测试类生成模拟数据。 - 基于Android Automotive源码构建自定义系统镜像:将应用签名加入系统白名单,或修改权限配置放开
CAR_SPEED权限,但该方式仅适用于定制化系统开发场景。
内容的提问来源于stack exchange,提问作者Doot
相关产品推荐
相关产品推荐

