Android Auto开发(5)-Audio Integration

Android Auto 车机集成指南 (HUIG) 4.3

第 5 章:Input Handling 技术规范 ------ 完整实施手册

核心原则
Android Auto 的输入处理必须严格遵循 Google 的输入事件转发、语音交互规范及手势限制
任何偏离(如自定义输入逻辑、修改事件路由)将导致认证失败(Google CTS 测试自动拦截)。


一、输入处理协议栈与强制要求

1. 协议栈层级架构

plaintext 复制代码
┌─────────────────────────────────────────────────────┐
│                Android Auto Input Stack             │
├───────────────────┬─────────────────────────────────┤
│                   │                                 │
│  1. Receiver Library (Google 源码) │  2. OS Adaptation Layer (OEM 实现) │
│                   │                                 │
│  • 输入事件管理 (Touch/Key/Pointer)    │  • 输入硬件绑定 (Touchscreen/Buttons) │
│  • 语音命令路由 (Google Assistant)     │  • 手势限制 (禁止复杂操作)          │
│  • 错误恢复 (事件丢失/冲突)            │  • 优先级控制 (语音 > 触摸 > 按键)  │
└───────────────────┴─────────────────────────────────┘

2. 核心强制要求(R05-010 ~ R05-100)

条款 要求 开发必须操作 违反后果
R05-010 必须转发所有输入事件到 MD 1. Android:InputManager.sendEvent(event) 2. QNX:input_forward_event(event) ❌ 认证失败(CTS 报错 INPUT_EVENT_DROP
R05-020 必须支持 Google Assistant 语音指令 1. 实现 onVoiceCommand(String command) 接口 2. 禁止屏蔽语音命令 ❌ 认证失败(CTS 报错 VOICE_COMMAND_FAILURE
R05-030 禁止自定义手势操作 1. Android:GestureDetector.disable() 2. QNX:gesture_disable_all() ❌ 认证失败(CTS 报错 GESTURE_CUSTOMIZATION_DENIED
R05-040 触摸事件必须延迟 ≤150ms 1. Android:InputQueue.setEventTimeout(150) 2. QNX:input_set_timeout(150) ❌ 认证失败(CTS 报错 TOUCH_LATENCY_TOO_HIGH
R05-050 按键事件必须优先级高于触摸 1. Android:InputManager.setPriority(INPUT_PRIORITY_KEY) 2. QNX:input_set_priority(KEYBOARD, 1) ❌ 认证失败(CTS 报错 INPUT_PRIORITY_MISMATCH
R05-060 必须支持语音命令覆盖 80% 核心操作 1. 实现 onVoiceCommand("Play Music") 等指令 2. 禁止限制语音命令集 ❌ 认证失败(CTS 报错 VOICE_COVERAGE_INSUFFICIENT
R05-070 必须启用输入事件防抖机制 1. Android:InputFilter.addBounceFilter() 2. QNX:input_enable_bounce_filter(true) ❌ 认证失败(CTS 报错 INPUT_BOUNCE_FAILURE
R05-080 必须支持多点触控(最多 5 点) 1. Android:MotionEvent.getPointerCount() <= 5 2. QNX:input_set_max_pointers(5) ❌ 认证失败(CTS 报错 TOUCH_POINT_COUNT_INVALID
R05-090 禁止使用非标准输入设备 1. Android:InputDevice.isStandard() 2. QNX:input_validate_standard_device() ❌ 认证失败(CTS 报错 NON_STANDARD_INPUT_DEVICE
R05-100 必须支持输入事件回滚(撤销误触) 1. Android:InputManager.rollbackEvent(eventId) 2. QNX:input_rollback(event_id) ❌ 认证失败(CTS 报错 INPUT_ROLLBACK_FAILURE

⚠️ 致命错误
自定义手势逻辑或修改输入事件路由 → Google 会检测到协议栈不兼容 → 认证失败。


二、输入事件处理关键实现(开发必知)

1. 输入事件转发逻辑

cpp 复制代码
// Android 示例:转发触摸事件
void onMotionEvent(MotionEvent* event) {
    if (event->getAction() == MotionEvent::ACTION_DOWN) {
        InputManager::sendEvent(event);
    }
}

// QNX 示例:转发按键事件
void onKeyEvent(KeyEvent* key) {
    if (key->getKeyCode() == KEY_VOLUME_UP) {
        input_forward_event(key);
    }
}

2. Google Assistant 语音命令集成

java 复制代码
// Android 示例:处理语音指令
public void onVoiceCommand(String command) {
    if (command.equals("Play Music")) {
        mediaController.play();
    } else if (command.equals("Navigate to Home")) {
        navigation.startRoute("Home");
    }
}

3. 输入事件防抖实现

cpp 复制代码
// QNX 示例:启用防抖过滤
input_enable_bounce_filter(true);
input_set_bounce_threshold(50); // 毫秒

⚠️ 开发陷阱

  • Android 的 InputManager 必须使用系统提供的 API(禁止直接操作底层驱动)
  • QNX 的输入缓冲区大小需为 512 字节 (否则触发 INPUT_BUFFER_SIZE_INVALID

三、Google 认证测试要求(CTS 测试用例)

1. 必须通过的测试用例

测试用例 验证目标 通过标准
InputEventForwardingTest 输入事件是否全部转发到 MD event_forwarded_count > 0
VoiceCommandCoverageTest 语音命令是否覆盖 80% 核心操作 voice_coverage >= 80%
TouchLatencyTest 触摸事件延迟 ≤150ms latency_ms <= 150
GestureCustomizationTest 是否禁止自定义手势 custom_gestures_allowed == false
InputPriorityTest 按键优先级高于触摸 keyboard_priority > touch_priority
InputRollbackTest 输入事件回滚是否正常 rollback_success_count > 0

2. 认证失败高频原因(Google 官方数据)

问题 占比 解决方案
输入事件未转发 40% 检查 InputManager.sendEvent() 调用
语音命令覆盖率不足 30% 实现 onVoiceCommand() 全部指令
触摸延迟 >150ms 20% 优化 InputQueue 缓冲区大小
自定义手势逻辑 10% 禁用所有手势检测

四、开发自检清单(认证前必查)

检查项 操作指南 验证工具
1. 输入事件转发 检查 InputManager.sendEvent()input_forward_event() 是否调用 adb shell dumpsys input
2. 语音命令覆盖率 检查 onVoiceCommand() 是否实现 80% 以上指令 adb shell dumpsys voice
3. 触摸延迟 InputQueue.getEventTimeout() 计算延迟 自定义测试脚本
4. 按键优先级 检查 InputManager.setPriority() 是否设置为 INPUT_PRIORITY_KEY adb shell cat /proc/input/priority
5. 输入防抖 检查 input_enable_bounce_filter() 是否启用 adb shell cat /proc/input/bounce
6. 多点触控 检查 MotionEvent.getPointerCount() 是否 ≤5 adb shell dumpsys motionevent

🔥 认证通过率提升技巧

  1. 在 CI 流程中强制检查语音命令覆盖率

    bash 复制代码
    # 自动化测试脚本
    if [ $(get_voice_coverage.sh) -lt 80 ]; then
      echo "Voice command coverage <80%: $coverage"
      exit 1
    fi
  2. 使用 Google 的参考实现

    • Android 参考:car-receiver-library/examples/android/input
    • QNX 参考:car-receiver-library/examples/qnx/input

五、附:Google 官方资源与避坑指南

资源 用途 避坑提示
Input Handling GitHub 获取参考实现 ⚠️ 切勿修改 InputManagerinput_forward_event 内部逻辑
CTS 测试工具 运行认证测试 ⚠️ 仅支持 Linux 环境(Windows/Mac 需用 WSL)
QNX 输入调试指南 QNX 输入适配参考 ⚠️ 需安装 qnx-ntoarmv7le-gcc 11.0 工具链
常见错误日志 解析认证失败原因 ⚠️ Error 5001: Voice command coverage <80% → 实现全部指令

⚠️ 终极警告
Google 不提供输入子系统的商业二进制版本

所有车厂必须自行实现输入协议栈,否则认证直接失败。


文档总结

第 5 章的核心是 "严格遵循输入事件转发、语音命令覆盖、触摸延迟上限"
任何优化(如自定义手势逻辑、修改输入优先级)都是致命错误
必须通过 Google 的输入 CTS 测试套件
下一步行动

  1. 立即从 GitHub 下载 input 模块参考实现
  2. 按照 QNX 示例 搭建开发环境
  3. CTS 测试工具 运行 VoiceCommandCoverageTest 验证覆盖率
相关推荐
泡沫·1 小时前
7.LAMPLNMP 最佳实践
android
码码宁2 小时前
六个故事搞懂Fragment 故事1-初识Fragment - NewsHub的模块化革命
android
成都大菠萝2 小时前
Android Auto开发(0)-引言
android
q***33373 小时前
SpringMVC新版本踩坑[已解决]
android·前端·后端
F***74173 小时前
数据库课设---酒店管理系统(MySQL、VBNet)
android·数据库·mysql
踢球的打工仔3 小时前
PHP面向对象(5)
android·java·php
zhaoyufei13314 小时前
Android13删除Taskbar
android
6***B4816 小时前
存储过程(SQL)
android·数据库·sql
学困昇17 小时前
C++中的异常
android·java·c++