【问题标题】:Issue with Android Wear Message APIAndroid Wear 消息 API 的问题
【发布时间】:2016-02-02 23:01:42
【问题描述】:

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

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

如果我在重启后立即通过通讯消息调用启动我的 Watch 应用,而没有先运行 Watch App Activity,那么从 Watch 返回的消息回复将丢失,并且手机应用看不到。

如果我在重启后和从电话应用启动通信之前在 Watch 应用中运行 Activity,那么即使我在发送任何消息之前关闭 Watch Activity,通信消息也可以正常工作。

Watch 端的 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 Activity 尚未运行,则此行为仅在重启后立即发生。

--编辑-- @墨菲:

好吧,我查看了您的代码,它似乎与我已经拥有的几乎相同,实际上我有以下代码代替您的电话:

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();
}

因此,就手表丢失的通讯而言,差异并不显着,但无论如何感谢您的帮助。

问候,

【问题讨论】:

  • 有人解决了这个问题吗?

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


【解决方案1】:

首先,您不需要为消息API添加Listener并实现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());
}

【讨论】:

    【解决方案2】:

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

    我建议您在发送Message 之前检查手机端的Wear 连接:

    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) {
    
        }
    })
    

    【讨论】:

    • 嗨墨菲,感谢您的回复。我可以试试你的建议,但是如果没有连接我该怎么办?只需旋转几毫秒,然后再试一次?
    • 嗨墨菲,我在我的问题脚下添加了一个编辑,显示了我已经拥有的内容。它实际上与您的相同,所以我认为这不是问题,但无论如何感谢您的帮助,
    • 好的,你知道它是真的发送消息还是因为没有连接而跳过?您可以添加日志并进行测试吗?如果未连接,我建议您等待连接,使用 Wea​​rable.NodeApi.addListener->onPeerConnected() 发送消息。我也将它添加到我的答案中。
    • 嗨墨菲,你是说打电话吗?我确定电话正在发送消息,但我不能说手表是否正在接收它并且未能传输回复或未能首先接收消息。这是因为当手机放入底座时我无法复制该问题(无论我是否正在调试手机都没有关系,手机在底座中时不会发生错误)。我尝试创建电话和手表应用程序的非调试签名版本,以查看它是否在调试器中,但我签名的应用程序显示相同的问题。谢谢,
    • 我也遇到了这个问题。我的 Wear 已连接,并且 getConnectedNodes() 也清楚地提到了它。但是当我从手机发送消息时,偶尔,它仍然会在途中丢失,并且永远不会到达手表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多