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

WearOS与Android应用通信异常求助:MessageClient替代MessageApi失效

Android 与 Wear OS 消息传递故障排查与修复

核心问题分析

你遇到的消息无法传递问题,主要由以下几个关键错误导致:

1. 应用ID不匹配

手机端应用ID为com.websarva.wings.android.practice_wear,穿戴端为com.websarva.wings.android.wear。Wear OS要求手机与穿戴应用的应用ID必须一致(或穿戴端为手机端ID加上.wear后缀),否则无法建立信任的消息通道。

2. 监听路径不匹配

  • 手机端发送的消息路径是/data_comm,但穿戴端DataListenerService中监听的消息路径是/data_comm_2,且Service的IntentFilter路径前缀为/logData,完全不匹配。
  • 穿戴端MainActivity的onMessageReceived虽然监听了/data_comm,但仅在应用前台(onResume注册、onPause移除)时生效,后台无法接收消息。

3. 权限缺失

Android 12及以上版本,Wear设备间的蓝牙通信需要明确申请蓝牙权限,否则无法发现或连接配对设备。

4. 代码冗余与逻辑混乱

同时使用了MessageClient监听(MainActivity)和WearableListenerService,两者职责重叠且配置错误,导致消息接收逻辑混乱。


修复步骤

步骤1:统一应用ID

修改穿戴端build.gradle的applicationId,与手机端保持一致:

// 穿戴端 build.gradle
defaultConfig {
    applicationId "com.websarva.wings.android.practice_wear" // 和手机端完全一致
    minSdk 26
    targetSdk 33
    versionCode 1
    versionName "1.0"
}

步骤2:补充必要权限

在手机端和穿戴端的AndroidManifest.xml顶部添加蓝牙相关权限:

<!-- 适配Android 12+的蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />

步骤3:修复消息监听逻辑

方案一:使用WearableListenerService(推荐,后台可接收)

修改穿戴端DataListenerService的路径匹配,并修正Manifest中的IntentFilter:

public class DataListenerService extends WearableListenerService {
    private Handler handler = new Handler(Looper.getMainLooper());

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        // 匹配手机端发送的路径 /data_comm
        if (messageEvent.getPath().equals("/data_comm")) {
            String receivedText = new String(messageEvent.getData());
            handler.post(() -> {
                // 通过广播通知MainActivity更新UI
                Intent intent = new Intent("com.websarva.wings.android.practice_wear.MESSAGE_RECEIVED");
                intent.putExtra("message", receivedText);
                sendBroadcast(intent);
                Toast.makeText(getApplicationContext(), receivedText, Toast.LENGTH_SHORT).show();
            });
        }
    }
}

更新穿戴端Manifest的Service配置:

<service
    android:name=".DataListenerService"
    android:exported="true">
    <intent-filter>
        <action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" />
        <data android:scheme="wear" android:host="*" android:pathPrefix="/data_comm" />
    </intent-filter>
</service>

方案二:修正MainActivity监听(仅前台接收)

如果只需要前台接收消息,在MainActivity中补充广播接收逻辑,确保消息能传递到UI:

public class MainActivity extends Activity implements MessageClient.OnMessageReceivedListener {
    private TextView textView;
    private BroadcastReceiver messageReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView);

        // 注册广播接收Service传来的消息
        messageReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String message = intent.getStringExtra("message");
                textView.setText(message);
            }
        };
        registerReceiver(messageReceiver, new IntentFilter("com.websarva.wings.android.practice_wear.MESSAGE_RECEIVED"));
    }

    @Override
    protected void onResume() {
        super.onResume();
        Wearable.getMessageClient(this).addListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        Wearable.getMessageClient(this).removeListener(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(messageReceiver); // 销毁时取消广播注册
    }

    @Override
    public void onMessageReceived(@NonNull final MessageEvent messageEvent) {
        if (messageEvent.getPath().equals("/data_comm")) {
            runOnUiThread(() -> {
                String message = new String(messageEvent.getData());
                textView.setText(message);
            });
        }
    }
}

步骤4:调试验证

  1. 确保手机与穿戴设备已通过Wear OS应用配对成功。
  2. 重新安装两端应用,查看手机端日志:
    • 若打印Message sent successfully to: [设备名],说明消息发送成功。
    • 若打印Failed to get connected nodes,检查配对状态和权限是否正常。
  3. 查看穿戴端日志,确认onMessageReceived方法是否被触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:29:51