Flutter Android应用与Wear OS 4设备双向消息收发失效求助
Flutter Android应用与Wear OS 4设备双向消息收发失效求助
看起来你已经把两端的基础代码都搭好了,但双向消息收发还是没通,我来帮你梳理下可能的问题点和修复方案👇
一、Flutter端的关键修复点
提前初始化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'); }); }确认权限配置
检查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端的核心问题修复
修复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!初始化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"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}") } } } } } }
三、最后试试这些排查小技巧
- 重启手机和Wear OS设备,Data Layer的连接偶尔会出现缓存问题,重启能快速解决。
- 用adb同时查看两端日志:
- 手机端:
adb logcat -s flutter看Flutter的发送/接收日志 - Wear OS端:
adb -s <你的Wear设备ID> logcat -s DataLayer,DataLayerService看Wear的日志
- 手机端:
- 确认两者的Google Play Services版本尽量接近,版本差异过大可能导致Data Layer不兼容。
内容来源于stack exchange
相关产品推荐
相关产品推荐

