Android手持设备和可穿戴设备收不到消息

标签 android android-service wear-os

我正在尝试从可穿戴设备向手持设备发送消息,然后从手持设备向可穿戴设备发送响应(两个模块使用相同的代码和逻辑)。
Gradle :

compile 'com.google.android.support:wearable:2.0.0-alpha2'
compile 'com.google.android.gms:play-services-wearable:9.6.1'

...

classpath 'com.android.tools.build:gradle:2.2.1'
classpath 'com.google.gms:google-services:3.0.0'

AndroidManifest:

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

ReceiverService:

public class ReceiverService extends WearableListenerService {
    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        super.onMessageReceived(messageEvent);
        Log.v(TAG, "onMessageReceived: " + messageEvent);
    }
}

消息发送者:

public class MessageSender implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    private static final String TAG = "_wear_message_sender";
    private final GoogleApiClient mGoogleApiClient;

    private static class InstanceHolder {
        private static final MessageSender sInstance = new MessageSender();
    }

    private MessageSender() {
        mGoogleApiClient = new GoogleApiClient.Builder(WearApp.getInstance().getContext())
                .addApi(Wearable.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }

    public static MessageSender getInstance() {
        return InstanceHolder.sInstance;
    }

    public void sendMessage(final String path, final String message) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (!mGoogleApiClient.isConnected()) {
                    mGoogleApiClient.blockingConnect(Constants.GOOGLE_API_CLIENT_TIMEOUT_S, TimeUnit.SECONDS);
                }    
                List<Node> nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await().getNodes();
                Log.d(TAG, "Nodes count " + nodes.size());

                for (Node node : nodes) {
                    Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), path, message.getBytes()).setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {
                        @Override
                        public void onResult(MessageApi.SendMessageResult sendMessageResult) {
                            Log.d(TAG, "sendMessage(" + path + "): " + sendMessageResult.getStatus().isSuccess());
                        }
                    });
                }
                mGoogleApiClient.disconnect();
            }
        }).start();
    }
    ...
}

我得到了这个输出:

D/_wear_message_sender: onConnected: null
D/_wear_message_sender: Nodes count 1
D/_wear_message_sender: sendMessage(/test): true

我使用了 Moto 360 和模拟器,消息已发送但手持设备 WearableListenerService onMessageReceived() 未被调用。反之亦然,我从手机发送了一条消息,但未调用可穿戴设备 onMessageReceived
我在这里错过了什么?

最佳答案

检查 applicationID在移动应用程序和可穿戴应用程序的 build.gradle 中是相同的,因为否则 Android 将不知道应该将消息发送到哪个。你可以查看这个SO thread .还要确保 buildTypes 部分和 signingConfigs 部分在两个应用程序中相同。

关于Android手持设备和可穿戴设备收不到消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39980394/

相关文章:

Android后台服务从phonegap获取window.localStorage

wear-os - 将运动传感器数据从 Android Wear 获取到 Android 手机

java - 是否可以使用字符串作为随机实例的种子?

android - 在android上通过adb将标准输入写入文件

java - Android 应用程序 - 删除多余的填充

java - PubNub 的 Android 服务

Android Navigation Drawer 和 windowActionBarOverlay = true

android - 通过全局对象访问Android服务

Android wearableListenerService 从 Activity 调用方法

Android Wear 2D Picker,如何控制查看汽车时转到哪一列