1. 通用蓝牙音箱(媒体按键)
     标准蓝牙音箱上的媒体控制键(播放/暂停、音量+/-、上一曲/下一曲)
❯ 2. 蓝牙耳机 + 品牌音箱
     带多媒体按键的蓝牙耳机(接听/挂断、切歌、音量调节)以及JBL、Bose等品牌特殊按键
  3. 所有 HID 蓝牙设备
     如果能抓到所有按键最好,比如键盘、游戏手柄、遥控器等,不限于音箱
     
     
     App 如何与蓝牙音箱建立连接?

❯ 1. 自动扫描连接
     进入 App 后自动扫描并连接附近蓝牙设备,无需手动配对
  2. 手动选择设备
     显示附近设备列表,让用户手动点击选择要监听的设备
  3. 监听已配对设备
     用户先在系统设置里配对好,App 直接监听已配对的设备
     
     
你希望界面上显示哪些信息?

  1. 键值 + 名称映射清单
     原始 HID Usage ID + 按键名称映射(如 "0xE9 → Volume Up"),简单清单列表
❯ 2. 完整信息面板 + 历史记录
     显示设备信息、连接状态、按键历史记录、每个按键的时间戳和频率统计
  3. 全部 + 日志导出
     以上都要,再加一个日志导出功能,方便分析复杂按键组合
  4. Type something.
───────────────────────────────────────────────────────────────────────────────────────

你倾向于哪种技术路线来捕获蓝牙设备的按键?

  1. MediaSession API(推荐)
     通过 MediaSession API 监听媒体按键事件(KEYCODE_MEDIA_PLAY_PAUSE、KEYCODE_MEDIA_NEXT 等),标准按键都有,实现简单,但拿不到原始 HID 报文
  2. Accessibility Service
     通过 Android Accessibility Service 捕获全局按键事件,能拿到更多低级别的按键信息,但需要用户在系统设置中开启无障碍权限
❯ 3. 两步走:先 MediaSession 再扩展
     先做 MediaSession 方案覆盖通用按键,后续再扩展 Accessibility 方案
  4. Type something.
  
  需求总结

  ┌──────────┬─────────────────────────────────────────────────────────────┐
  │   维度   │                            决定                             │
  ├──────────┼─────────────────────────────────────────────────────────────┤
  │ 目标设备 │ 蓝牙耳机 + 品牌音箱(JBL、Bose 等)                         │
  ├──────────┼─────────────────────────────────────────────────────────────┤
  │ 连接方式 │ 监听已配对设备,不处理配对                                  │
  ├──────────┼─────────────────────────────────────────────────────────────┤
  │ 显示内容 │ 设备信息 + 连接状态 + 按键历史(时间戳)+ 按键统计频率      │
  ├──────────┼─────────────────────────────────────────────────────────────┤
  │ 技术路径 │ 两步走:先用 MediaSession API,再扩展 Accessibility         │
  ├──────────┼─────────────────────────────────────────────────────────────┤
  │ 阶段     │ Phase 1 → MediaSession 覆盖通用按键;Phase 2 → 扩展深度捕获 │
  └──────────┴─────────────────────────────────────────────────────────────┘

  ---
  方案对比

  方案 A(推荐):Flutter + Android Platform Channel

  ┌─────────────────────────────────────────────────┐
  │  Flutter UI Layer                                │
  │  ┌─────────┐  ┌──────────────┐  ┌────────────┐  │
  │  │ 设备面板  │  │ 按键历史列表  │  │ 统计图表   │  │
  │  └────┬─────┘  └──────┬──────┘  └─────┬──────┘  │
  │       └───────────────┼────────────────┘         │
  │                      │                          │
  │              Flutter Plugin (MethodChannel)      │
  └──────────────────────┼──────────────────────────┘
                         │
  ┌──────────────────────┼──────────────────────────┐
  │  Android Native Layer                           │
  │  ┌──────────────────┼──────────────────────┐    │
  │  │  MediaSessionService (监听按键)           │    │
  │  │  ┌─────────────────────────────────┐    │    │
  │  │  │ MediaSession.Callback           │    │    │
  │  │  │ onMediaButtonEvent → 解析 HID   │    │    │
  │  │  └─────────────────────────────────┘    │    │
  │  │  ┌─────────────────────────────────┐    │    │
  │  │  │ BluetoothBroadcastReceiver      │    │    │
  │  │  │ ACTION_ACL_CONNECTED/DISCONNECTED│   │    │
  │  │  └─────────────────────────────────┘    │    │
  │  └─────────────────────────────────────────┘    │
  └─────────────────────────────────────────────────┘

  - 优点:架构清晰,Flutter 和原生层职责分明,按键映射表维护在 Dart 侧方便扩展,后期加 Accessibility 只需扩展 Native 层
  - 缺点:需要自己写 Platform Channel 桥接代码


 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐