Android Wear Message API问题

时间:2014-10-20 16:03:57

标签: messaging wear-os android-wear-data-api

我正在尝试使用新的android wear comms API,特别是Message API,我在我的监视应用程序中有一个Activity加上一个服务,而一个Activity作为手机中的测试应用程序。

我有通信在两个方向都正常工作,我可以通过发送来自电话应用程序的消息启动我的Watch活动,除了一个只在重新启动手表硬件后立即发生的问题时,它也能正常工作:

如果我在重新启动后立即通过comms消息调用启动我的Watch应用程序而没有先运行Watch App Activity,那么从Watch返回的消息回复将丢失,而电话应用程序则无法看到。

如果我在重新启动后以及从电话应用程序启动通信之前在监视应用程序中运行活动,那么即使我在发送任何消息之前关闭监视活动,通信消息也能正常工作。

Watch侧的My WearableListenerService代码如下所示(缩写为)

public class MyClass extends WearableListenerService
                        implements MessageApi.MessageListener,
                                   ConnectionCallbacks,
                                   OnConnectionFailedListener
{

...

@Override
public void onCreate()
{
   mGoogleApiClient = new GoogleApiClient.Builder(this)
                                          .addApi(Wearable.API)
                                          .build();
}

@Override
public void onDestroy()
{
    mGoogleApiClient.disconnect();

   super.onDestroy();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) 
{
    int result = super.onStartCommand(intent, flags, startId);
    mGoogleApiClient.connect();

    return result;
}

@Override
public void onMessageReceived(MessageEvent messageEvent)
{
    comms.handleReceivedMessage (messageEvent);
}

public final void txReply(String txMessage, String nodeId)
{
    Wearable.MessageApi.sendMessage(mGoogleApiClient, 
                                    nodeId,
                                    MESSAGE_RECEIVED_PATH, 
                                    txMessage.getBytes());
}

@Override
public void onConnected(Bundle bundle)
{
    Wearable.MessageApi.addListener(mGoogleApiClient, this);
}

@Override
public void onConnectionSuspended(int arg0) 
{
    // TODO Auto-generated method stub
}

@Override
public void onConnectionFailed(ConnectionResult arg0) 
{
    // TODO Auto-generated method stub
}

}

我的comms.handleReceivedMessage()函数直接调用上面的txReply()函数,并且我已经使用LogCat验证了数据是否正确。

我非常感谢任何关于我可能遗漏的内容的指示,这会阻止我的第一个Watch App消息被电话应用程序接收。同样,如果在收到消息之前尚未运行Watch App活动,则仅在重新启动后立即发生此行为。

- EDIT-- @ Murphy:

好吧,我看了你的代码,它看起来和我已经拥有的几乎一样,事实上我有以下代替你的电话:

NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
for (Node node : nodes.getNodes()) 
{
    // Send message and wait for result
    SendMessageResult result = Wearable.MessageApi.sendMessage(mGoogleApiClient, 
                                                               node.getId(),
                                                               MESSAGE_RECEIVED_PATH, 
                                                               txm.getBytes()).await();
}

因此,手表迷失方面的差异并不显着,但无论如何都要感谢您的帮助。

此致

2 个答案:

答案 0 :(得分:1)

首先,您不需要为消息API添加addListener并实现MessageApi.MessageListener,因为WearableListenerService会为您执行此操作,您只需覆盖onMessageReceived方法。

至于问题,你应该确保google api已连接(如上所述,WearableListenerService由系统管理,因此你可以在连接api客户端之前收到消息):

public final void txReply(String txMessage, String nodeId)
{
    if (!mGoogleApiClient.isConnected()) 
    {
            ConnectionResult connectionResult 
                         = mGoogleApiClient.blockingConnect(30, TimeUnit.SECONDS);
            if (!connectionResult.isSuccess()) {
                //log or show error
                return;
            }
    }
    Wearable.MessageApi.sendMessage(mGoogleApiClient, 
                                nodeId,
                                MESSAGE_RECEIVED_PATH, 
                                txMessage.getBytes());
}

答案 1 :(得分:0)

连接googleApiClient并不能确保您与Wear建立联系。

我建议您在发送Wear之前在电话端检查Message连接:

Wearable.NodeApi.getConnectedNodes(getGoogleApiClient()).setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
    @Override
    public void onResult(NodeApi.GetConnectedNodesResult getConnectedNodesResult) {
        boolean isPeerConnected = getConnectedNodesResult.getNodes().size() > 0;
}});

编辑: 如果它没有连接,那么我可以在连接时发送:

Wearable.NodeApi.addListener(getGoogleApiClient(), new NodeApi.NodeListener() {
    @Override
    public void onPeerConnected(Node node) {
        // TODO send message
    }

    @Override
    public void onPeerDisconnected(Node node) {

    }
})