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

Flutter Android应用与Wear OS 4设备双向消息收发失效求助

Flutter Android应用与Wear OS 4设备双向消息收发失效求助

看起来你已经把两端的基础代码都搭好了,但双向消息收发还是没通,我来帮你梳理下可能的问题点和修复方案👇

一、Flutter端的关键修复点

  1. 提前初始化Wear API + 添加消息接收监听
    你现在在发送消息时才初始化API,这可能导致发送时机不对;而且你的代码只有发送逻辑,完全没加接收Wear OS消息的监听!修改你的页面初始化代码:

    @override
    void initState() {
      super.initState();
      // 提前在页面启动时初始化Wearable API
      _flutterWearOsConnectivity.configureWearableAPI();
      // 新增:监听来自Wear OS的消息
      _flutterWearOsConnectivity.messageReceivedStream.listen((event) {
        final messageContent = String.fromCharCodes(event.data);
        debugPrint('Flutter收到消息:路径=${event.path},内容=$messageContent');
      });
    }
    
  2. 确认权限配置
    检查Flutter项目的android/app/src/main/AndroidManifest.xml,确保添加了必要的蓝牙和Wear通信权限:

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="com.google.android.wearable.permission.RECEIVE_MESSAGE" />
    

二、Wear OS端的核心问题修复

  1. 修复Manifest中的Service权限(最可能导致收不到消息的原因)
    你的DataLayerListenerService缺少关键的绑定权限和数据匹配规则,修改后如下:

    <service
        android:name=".presentation.DataLayerListenerService"
        android:exported="true"
        android:permission="com.google.android.wearable.permission.BIND_LISTENER_SERVICE">
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" />
            <data
                android:scheme="wear"
                android:host="*"
                android:pathPrefix="/message" />
        </intent-filter>
    </service>
    

    没有BIND_LISTENER_SERVICE权限,系统根本不会把消息转发给你的Service!

  2. 初始化Data Layer连接
    你的Wear OS应用需要在启动时建立Data Layer连接,否则ListenerService无法正常工作。新增一个Application类:

    class WearApp : Application() {
        private lateinit var googleApiClient: GoogleApiClient
    
        override fun onCreate() {
            super.onCreate()
            googleApiClient = GoogleApiClient.Builder(this)
                .addApi(Wearable.API)
                .addConnectionCallbacks(object : GoogleApiClient.ConnectionCallbacks {
                    override fun onConnected(p0: Bundle?) {
                        Log.d("DataLayer", "Data Layer连接成功,可以收发消息了")
                    }
    
                    override fun onConnectionSuspended(p0: Int) {
                        Log.d("DataLayer", "Data Layer连接中断,尝试重连...")
                        googleApiClient.connect()
                    }
                })
                .build()
            googleApiClient.connect()
        }
    
        fun getGoogleApiClient() = googleApiClient
    }
    

    然后在Manifest的<application>标签里指定这个类:android:name=".WearApp"

  3. Wear OS发消息的正确方式
    如果你Wear OS发消息的代码有问题,试试这个示例:

    private fun sendMessageToPhone(content: String) {
        val apiClient = (application as WearApp).getGoogleApiClient()
        if (!apiClient.isConnected) {
            Log.e("DataLayer", "Data Layer未连接,无法发送消息")
            return
        }
        // 获取配对的手机Node ID
        Wearable.NodeApi.getConnectedNodes(apiClient).setResultCallback { result ->
            for (node in result.nodes) {
                if (node.isNearby) { // 只发给配对的手机设备
                    Wearable.MessageApi.sendMessage(
                        apiClient,
                        node.id,
                        "/message",
                        content.toByteArray()
                    ).setResultCallback { sendResult ->
                        if (sendResult.status.isSuccess) {
                            Log.d("DataLayer", "消息成功发送到手机:${node.id}")
                        } else {
                            Log.e("DataLayer", "发送失败:${sendResult.status.statusMessage}")
                        }
                    }
                }
            }
        }
    }
    

三、最后试试这些排查小技巧

  1. 重启手机和Wear OS设备,Data Layer的连接偶尔会出现缓存问题,重启能快速解决。
  2. 用adb同时查看两端日志:
    • 手机端:adb logcat -s flutter 看Flutter的发送/接收日志
    • Wear OS端:adb -s <你的Wear设备ID> logcat -s DataLayer,DataLayerService 看Wear的日志
  3. 确认两者的Google Play Services版本尽量接近,版本差异过大可能导致Data Layer不兼容。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 14:48:08