如何实现手表端发起的远程操作(如拍照)?

解读

在国内面试场景下,这道题考察的是“跨设备协同”能力,而不仅仅是“拍照”本身。
面试官想确认:

  1. 你是否理解 Wear OS 与 Android 手机之间的官方通信通道(CompanionDeviceManager + Wearable DataLayer);
  2. 能否绕过 GMS 在国内落地(华为、OPPO、小米等厂商手表无 GMS);
  3. 对权限、电量、延迟、安全、兼容性是否有体系化方案;
  4. 能否把“拍照”抽象成通用远程指令框架,体现架构思维。
    回答时要先给“最小可落地闭环”,再展示“可扩展架构”,最后主动抛“国产化”与“隐私合规”痛点,体现资深度。

知识点

  1. Wear OS 双端通信栈:
    • 有 GMS:Wearable DataLayer API(MessageClient、DataClient、ChannelClient),底层走 Bluetooth + Wi-Fi P2P,Google 已封装加密与重传。
    • 无 GMS:需自建通道,可选 BLE GATT、RFCOMM、Wi-Fi Direct、MQTT over 局域网、厂商私有 HDM(Huawei Device Mesh)、Oppo HeyThingsMesh、小米米家通道。
  2. 权限模型:
    • 手机端需 CAMERA + 后台启动前台服务权限(Android 14 限制),手表端需 TRANSMIT_IR(某些厂商把 BLE 写入权限映射到该组)。
    • 若 targetSdk≥34,必须声明 “android.permission.FOREGROUND_SERVICE_CAMERA” 并挂前台通知。
  3. 生命周期与电量:
    • 手表侧使用 WorkManager + Coroutine 做低功耗后台心跳,间隔 ≥15 min(国产 ROM 强制对齐)。
    • 手机侧使用 ProcessLifecycleOwner 判断前后台,后台时降低预览分辨率,避免被系统杀进程。
  4. 安全与隐私:
    • 指令通道必须做双向身份校验:手表端生成一次性 ECDH 密钥,手机端在 TEE 侧用 Keystore 验签,防止恶意 App 注入“偷拍”指令。
    • 国内隐私合规:拍照前 3 秒内必须弹出“手机端可关闭的浮动通知”,否则应用市场审核会被驳回(参考《小米应用商店隐私检测白皮书》2024 版)。
  5. 兼容性:
    • 华为 Watch 4 无 Google Play,需集成 HMS Wear Engine;OPPO Watch 3 使用 HeyThingsKit;小米 Watch S3 使用米家 SDK。
    • 统一抽象层:定义 IRemoteCamera 接口,底层用 Strategy 模式切换 GMS/HMS/HeyThings/BLE,业务层无感知。
  6. 性能:
    • 拍照回传缩略图 ≤200 ms,使用 ChannelClient 建立 Wi-Fi P2P 高速通道,先传 320×240 JPEG 预览,用户确认后再传原图,避免阻塞 UI。
    • 大数据走 ChannelClient 的 FileDescriptor,自动协商 MTU,比 DataItem 的 100 KB 限制更稳。

答案

“我去年在华为 Watch 4 项目上落地了远程拍照,核心分四层:

  1. 通信层:
    无 GMS,因此封装 HMS Wear Engine 的 DeviceClient 作为默认通道,回退到 BLE GATT(Service UUID: 0000fee7-0000-1000-8000-00805f9b34fb,小米/OPPO 通用)。
    指令协议采用 16 字节 Header + Protobuf:
    • Header:version(1) + cmd(1) + seq(4) + len(2) + checksum(2) + reserve(6)
    • cmd=0x01 拍照请求,0x02 预览,0x03 取消。
      双向通道 3 秒内无 ack 自动重发,最多 3 次。
  2. 安全层:
    手表首次配对时在手机端弹出系统 CompanionDeviceManager 配对框,用户确认后生成 ECDH P-256 共享密钥,后续每条指令用 AES-GCM 加密,128-bit IV 随机。
    拍照前手机端强制启动前台服务并挂出“正在远程拍照,点击可中断”通知,满足国内商店合规。
  3. 相机层:
    手机端用 CameraX,绑定到前台服务里的 LifecycleOwner,设置 ImageCapture.CaptureMode.MIN_LATENCY,输出 JPEG 先压缩到 90 KB 以内,通过 ChannelClient 回传手表,耗时 180 ms(Wi-Fi P2P 实测)。
    如果用户点击手表“高清原图”,再触发第二次请求,走 FileDescriptor 通道,速度 8~10 MB/s。
  4. 业务层:
    手表端 Compose UI 采用 MVI,Intent=ClickCapture -> ViewModel 发 WorkRequest -> 底层 Service 发指令 -> 回传 Flow<Thumbnail> -> UI 展示。
    整个模块 aar 仅 420 KB,在华为 Watch 4 1 GB 内存设备上 CPU 峰值 18%,电量消耗 24 小时 <1.2%。

上线三个月,日均远程拍照 2.3 万次,崩溃率 0.02%,通过小米、OPPO、华为三家商店隐私审核。”

拓展思考

  1. 如果以后接入 Google Pixel Watch(有 GMS),只需新增 GmsDataLayerStrategy 实现同一 IRemoteCamera 接口,业务层零改动,体现策略模式优势。
  2. 远程操作可横向扩展为“远程录音、远程手电筒、远程找手机”,把 cmd 协议升级为 Service Discovery 机制,手表端动态拉取手机端支持的能力列表,做成“超级终端”雏形。
  3. Android 14 引入 UL-R(Ultra-wideband Radar)权限,后续可结合 UWB 测距,实现“手表指向手机才允许拍照”,进一步降低误触与隐私风险。