カスタムの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}
何か案は?
「applicationId」が両方のアプリ、つまりAndroid Wearのアプリと携帯電話のアプリ)で同じであることを確認しましたか?
追加したときに同じ問題がありましたAndroid既存のアプリのサポートを着用します。
ウェアアプリのデバイスアプリでbuild.gradleの署名部分を追加するのを忘れました。したがって、両方のアプリでbuildTypes部分とsigningConfigs部分が同じであることを確認してください。
ここで説明したのと同様の問題が発生しました https://plus.google.com/116088533685577893615/posts/deCyoF6ALvV 。私の実験に基づいて、ウォッチアプリのパッケージ名はハンドヘルドアプリのパッケージ名と同じである必要があるようです(ただし、ドキュメント化されていません)。メッセージAPIのサンプルプロジェクトをここに作成しました https://github.com/petrnalevka/wear 。
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());
}
ウェアからデバイスまで、デバイスからウェアまで、メッセージが機能するサンプルコードがあります。 https://github.com/kentarosu/AndroidWearAndLIFX
通常の容疑者は次のとおりです。
基本的なケースでは、両方のアプリの段階的な構成で、次の部分は同一である必要があります。
defaultConfig {
applicationId = "com.your.domain"
}
signingConfigs {
debug {
storeFile file("../debug.keystore")
}
release {
storeFile file("../release.keystore")
}
}
Bothアプリは同じapplicationIdを使用し、同じ証明書で署名する必要があります。