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做前缀匹配。
- 将Manifest中的
4. 确认Wear端服务注册正确性
检查Wear端Manifest中服务的类名、包名是否与实际代码完全一致,避免因类名拼写错误导致服务无法被系统识别。
5. 保持Wear端应用活跃
Wear OS的后台服务可能被系统回收,测试时确保Wear端应用处于前台或后台活跃状态,避免服务被杀死。
内容的提问来源于stack exchange,提问作者Juan Vazquez
相关产品推荐
相关产品推荐

