You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wear端WearableListenerService无法接收移动端数据,数据被移动端服务捕获

Wear OS 跨设备数据传递异常问题

问题现象

Android移动端通过DataClient发送PutDataItem请求已确认成功,但Wear端的WearableListenerService的onDataChanged方法无法接收数据;已确认设备节点连接正常,目前数据被移动端同配置的本地服务捕获,而非Wear端服务。

环境信息

  • Wear设备:Wear OS Square API 33 模拟器
  • 手机设备:努比亚红魔8S Pro API 33 物理设备

相关代码

移动端发送数据方法

private fun sendData(data: String, dataClient: DataClient){
    viewLifecycleOwner.lifecycleScope.launch {
        try {
            val request = PutDataMapRequest.create("/data-path").apply {
                dataMap.putString("DATA_KEY", data)
            }
                .asPutDataRequest()
                .setUrgent()

            val result = dataClient.putDataItem(request).await()

            Log.d("TAG", "DataItem saved: $result")
        } catch (cancellationException: CancellationException) {
            throw cancellationException
        } catch (exception: Exception) {
            Log.d("TAG", "Saving DataItem failed: $exception")
        }
    }
}

Wear端服务代码

class WearOsWearableListenerService : WearableListenerService() {
override fun onDataChanged(dataEvents: DataEventBuffer) {
    for (event in dataEvents) {
        if (event.type == DataEvent.TYPE_CHANGED) {
            val item = event.dataItem
            if (item.uri.path?.compareTo("/data-path") == 0) {
                val dataMap = DataMapItem.fromDataItem(item).dataMap
                dataMap.getInt("DATA_KEY")

                val intent = Intent("com.pkg.wearable.DATA_CHANGED")
                intent.putExtra("TOKEN_DATA",  dataMap.getInt("DATA_KEY"))
                LocalBroadcastManager.getInstance(this).sendBroadcast(intent)

            }
        }
    }
}
}

Wear端Manifest配置

<service
        android:name="com.pkg.wearable.services.WearOsWearableListenerService"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" />
            <data
                android:host="*"
                android:pathPrefix="/start-activity"
                android:scheme="wear" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
            <data
                android:host="*"
                android:pathPrefix="/data-path"
                android:scheme="wear" />
        </intent-filter>
    </service>

注:移动端服务配置与Wear端一致,仅类名不同。

问题排查与修复方案

1. 数据类型不匹配

移动端存入DATA_KEY的是String类型,但Wear端用getInt()读取,会导致数据解析失败(无报错日志但逻辑无法正常执行)。

  • 修复:Wear端改用getString("DATA_KEY")读取数据:
val token = dataMap.getString("DATA_KEY")
val intent = Intent("com.pkg.wearable.CUSTOM_DATA_CHANGED")
intent.putExtra("TOKEN_DATA", token)

2. 广播Action命名冲突

Wear端广播使用的com.pkg.wearable.DATA_CHANGED与Google Wear API的Action命名接近,且移动端存在同配置服务,导致数据被移动端本地服务拦截。

  • 修复:将广播Action改为自定义唯一标识,比如com.pkg.wearable.CUSTOM_DATA_CHANGED,避免冲突。

3. 路径匹配逻辑不一致

Manifest中配置的是pathPrefix="/data-path",但代码中用path?.compareTo("/data-path") == 0做精确匹配,若数据路径存在后缀会导致匹配失败。

  • 修复二选一:
    • 将Manifest中的pathPrefix改为path="/data-path",保持精确匹配;
    • 代码中改用path?.startsWith("/data-path") == true做前缀匹配。

4. 确认Wear端服务注册正确性

检查Wear端Manifest中服务的类名、包名是否与实际代码完全一致,避免因类名拼写错误导致服务无法被系统识别。

5. 保持Wear端应用活跃

Wear OS的后台服务可能被系统回收,测试时确保Wear端应用处于前台或后台活跃状态,避免服务被杀死。


内容的提问来源于stack exchange,提问作者Juan Vazquez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:47:09