web-dev-qa-db-ja.com

Android Wearからホストデバイスへのメッセージの送信

カスタムのAndroid接続されているホストデバイス(電話)に1回限りのメッセージを送信することになっているWearアプリケーションを作成しています。よく: http://developer.Android.com/training/wearables/data-layer/messages.html

My AndroidアプリにはWearableListenerServiceがあり、my Android WearアプリはメッセージAPIを使用してメッセージを送信します。WearableListenerServiceは、次の方法なので、サービスがうまく接続されていると確信しています

@Override
public void onPeerConnected(Node peer) {
    super.onPeerConnected(peer);

    String id = peer.getId();
    String name = peer.getDisplayName();

    Log.d(LOG_TAG, "Connected peer name & ID: " + name + "|" + id);
}

ログ出力:

/AndroidWearListenerService(19892): Connected peer name & ID: facdc219-37f5-4326-8fa6-1c8b8d3b6669|facdc219-37f5-4326-8fa6-1c8b8d3b6669

ただし、onMessageReceivedメソッドはトリガーされません。

@Override
public void onMessageReceived(MessageEvent messageEvent) {
    Log.d(LOG_TAG, "MessageEvent received: " + messageEvent.getData());
    //do work
}

Android Wear code。ボイラープレートコードのほとんどを削除し、必要なビットのみを残しました

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);

    final GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .build();

    googleApiClient.connect();

    final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
    stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
        @Override
        public void onLayoutInflated(WatchViewStub stub) {
            fireMessage();
        }

        private void fireMessage() {
            // Send the RPC
            PendingResult<NodeApi.GetConnectedNodesResult> nodes = Wearable.NodeApi.getConnectedNodes(googleApiClient);
            nodes.setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
                @Override
                public void onResult(NodeApi.GetConnectedNodesResult result) {
                    for (int i = 0; i < result.getNodes().size(); i++) {
                        Node node = result.getNodes().get(i);
                        String nName = node.getDisplayName();
                        String nId = node.getId();
                        Log.d(TAG, "Node name and ID: " + nName + " | " + nId);

                        Wearable.MessageApi.addListener(googleApiClient, new MessageApi.MessageListener() {
                            @Override
                            public void onMessageReceived(MessageEvent messageEvent) {
                                Log.d(TAG, "Message received: " + messageEvent);
                            }
                        });

                        PendingResult<MessageApi.SendMessageResult> messageResult = Wearable.MessageApi.sendMessage(googleApiClient, node.getId(),
                                PATH, null);
                        messageResult.setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {
                            @Override
                            public void onResult(MessageApi.SendMessageResult sendMessageResult) {
                                Status status = sendMessageResult.getStatus();
                                Log.d(TAG, "Status: " + status.toString());
                                if (status.getStatusCode() != WearableStatusCodes.SUCCESS) {
                                    alertButton.setProgress(-1);
                                    label.setText("Tap to retry. Alert not sent :(");
                                }
                            }
                        });
                    }
                }
            });
        }
    });
}

ロギングはメッセージが正常に送信されたことを示しているようですが、AndroidアプリのWearableListenerService.onMessageReceivedは起動しません。

D/MyWearApp MyActivity( 2014): Node name and ID: a2ba665d-a559-4a95-91d2-c16fc7873e28 | a2ba665d-a559-4a95-91d2-c16fc7873e28
D/MyWearApp MyActivity( 2014): Status: Status{statusCode=SUCCESS, resolution=null}

何か案は?

24
ebernie

applicationId」が両方のアプリ、つまりAndroid Wearのアプリと携帯電話のアプリ)で同じであることを確認しましたか?

50
Dominique

追加したときに同じ問題がありましたAndroid既存のアプリのサポートを着用します。

ウェアアプリのデバイスアプリでbuild.gradleの署名部分を追加するのを忘れました。したがって、両方のアプリでbuildTypes部分とsigningConfigs部分が同じであることを確認してください。

4
ui-jakob

ここで説明したのと同様の問題が発生しました https://plus.google.com/116088533685577893615/posts/deCyoF6ALvV 。私の実験に基づいて、ウォッチアプリのパッケージ名はハンドヘルドアプリのパッケージ名と同じである必要があるようです(ただし、ドキュメント化されていません)。メッセージAPIのサンプルプロジェクトをここに作成しました https://github.com/petrnalevka/wear

3
Petr Nalevka

SendMessage()メソッドの最後にawait()を追加してみてください。

PendingResult<MessageApi.SendMessageResult> messageResult = Wearable.MessageApi.sendMessage(googleApiClient, node.getId(),
                                PATH, null).await();

以下の前の回答は、Androidデバイス(モバイル))のアクティビティがアクティブなときにのみメッセージを送信するためのものです。

Android WearからAndroidデバイスにメッセージを送信しようとしているため、メッセージリスナーをAndroidにないデバイスAndroid Wear、以下のコードをMainActivityに追加する必要がありますAndroid(モバイル)

final GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
        .addApi(Wearable.API)
        .build();

googleApiClient.connect();

Wearable.MessageApi.addListener(googleApiClient, new MessageApi.MessageListener() {
         @Override
         public void onMessageReceived(MessageEvent messageEvent) {
                  Log.d(TAG, "Message received: " + messageEvent.getPath());
         }
});

より簡単なSendMessage()メソッドを試すこともできます

SendMessageResult result = Wearable.MessageApi.sendMessage(
        mGoogleApiClient, node.getId(), "STRING TO BE SENT", null).await();
if (!result.getStatus().isSuccess()) {
    Log.e(TAG, "ERROR: failed to send Message: " + result.getStatus());
}
2
wenjiun

ウェアからデバイスまで、デバイスからウェアまで、メッセージが機能するサンプルコードがあります。 https://github.com/kentarosu/AndroidWearAndLIFX

2
gatlingxyz

数か月前、Android wear。以下のリンク:

OnMessageReceivedはWearableListenerServiceで呼び出されません

これが誰かを助けることを願っています。

1
Lakhan Sharma

通常の容疑者は次のとおりです。

  • applicationId他の人が述べたように
  • 証明書に署名使用済み

基本的なケースでは、両方のアプリの段階的な構成で、次の部分は同一である必要があります。

defaultConfig {
    applicationId = "com.your.domain" 
}

signingConfigs {
    debug {
        storeFile file("../debug.keystore")
    }
    release {
        storeFile file("../release.keystore")
    }
} 

Bothアプリは同じapplicationIdを使用し、同じ証明書で署名する必要があります。

0
Plato