2

私は新しいandroid wear comms API、特にWatchアプリケーションにアクティビティとサービス、電話のテストアプリとしてアクティビティを持つMessage APIを使用しようとしています。

通信は両方向で正常に機能しており、時計ハードウェアの再起動直後にのみ発生する 1 つの問題を除いて、電話アプリからメッセージを送信することで、通信を介して時計アクティビティを開始することもできます。

最初に Watch アプリのアクティビティを実行せずに、再起動直後に通信メッセージ呼び出しを介して Watch アプリを起動すると、Watch から返されたメッセージの返信が失われ、電話アプリに表示されません。

再起動後、電話アプリから通信を開始する前に Watch アプリでアクティビティを実行すると、メッセージを送信する前に Watch アクティビティを閉じても、通信メッセージは正常に機能します。

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 アプリのメッセージが電話アプリで受信されない原因となっている可能性があるものについて、何か指摘があれば非常にありがたいです。繰り返しますが、この動作は、メッセージを受信する前に Watch App アクティビティが実行されていない場合、再起動直後にのみ発生します。

--編集-- @ マーフィー:

さて、私はあなたのコードを見ましたが、それは私がすでに持っているものとほとんど同じように見えます.実際、私はあなたの呼び出しの代わりに次のものを持っています:

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

そのため、時計からの通信が失われるという点では大きな違いはありませんが、とにかく助けてくれてありがとう.

よろしく、

4

2 に答える 2

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());
}
于 2014-10-27T02:51:15.157 に答える
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) {

    }
})
于 2014-10-21T08:04:50.430 に答える