Результат Wearable.NodeApi.getConnectedNodes никогда не вызывался

Я разрабатываю приложение для износа android. Ниже код с объяснением проблемы

if(mGoogleApiClient.isConnected()){ Ki("Always called!"); Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() { @Override public void onResult(NodeApi.GetConnectedNodesResult nodes) { Ki("Never called :( "); for (Node node : nodes.getNodes()) { Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), message, null); } } }); } 

UPD: я решаю проблему, выключая и снова включаю свой телефон (Nexus 5) Может быть, есть более простой способ решить проблему?

Пытался добавить .await () и AsyncTask, но результат тот же

Solutions Collecting From Web of "Результат Wearable.NodeApi.getConnectedNodes никогда не вызывался"

Я считаю, что вы можете только вызвать getConnectedNodes один раз за соединение GoogleApiClient. Вы хотите кэшировать идентификатор узла при первом получении результата, а затем использовать обратные вызовы onPeerConnected / Disconnected () для отслеживания соответствия идентификатора узла.

Если вы посмотрите образцы одежды для google, появится проект под названием FindMyPhone. Я думаю, что они решают вашу проблему намного чище. Они проверяют, подключено или отключено устройство с помощью фоновой службы.

 package com.example.android.wearable.findphone; import android.app.Notification; import android.app.NotificationManager; import com.google.android.gms.wearable.WearableListenerService; /** * Listens for disconnection from home device. */ public class DisconnectListenerService extends WearableListenerService { private static final String TAG = "ExampleFindPhoneApp"; private static final int FORGOT_PHONE_NOTIFICATION_ID = 1; @Override public void onPeerDisconnected(com.google.android.gms.wearable.Node peer) { // Create a "forgot phone" notification when phone connection is broken. Notification.Builder notificationBuilder = new Notification.Builder(this) .setContentTitle(getString(R.string.left_phone_title)) .setContentText(getString(R.string.left_phone_content)) .setVibrate(new long[] {0, 200}) // Vibrate for 200 milliseconds. .setSmallIcon(R.drawable.ic_launcher) .setLocalOnly(true) .setPriority(Notification.PRIORITY_MAX); Notification card = notificationBuilder.build(); ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)) .notify(FORGOT_PHONE_NOTIFICATION_ID, card); } @Override public void onPeerConnected(com.google.android.gms.wearable.Node peer) { // Remove the "forgot phone" notification when connection is restored. ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)) .cancel(FORGOT_PHONE_NOTIFICATION_ID); } } 

Они также добавляют это в AndroidManifest.xml

 <service android:name=".DisconnectListenerService" > <intent-filter> <action android:name="com.google.android.gms.wearable.BIND_LISTENER" /> </intent-filter> </service> 

Я получил его работу:

Инициируйте клиент Google API:

 private void initGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(Bundle bundle) { Log.d(TAG, "ConnectionCallback onConnected"); if (servicesAvailable()) { // new CheckWearableConnected().execute(); resolveNodes(); } } @Override public void onConnectionSuspended(int i) { Log.d(TAG, "ConnectionCallback onConnectionSuspended"); } }) .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.d(TAG, "ConnectionCallback onConnectionFailed"); //TODO do something on connection failed } }) .build(); } 

Затем в вашем методе onStart подключите клиент API:

 @Override public void onStart() { super.onStart(); mGoogleApiClient.connect(); } 

И очистить, в вашем методе onStop:

 @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop"); if (mGoogleApiClient != null) if (mGoogleApiClient.isConnected()) mGoogleApiClient.disconnect(); } 

Вот полный код проверки:

Добавьте это в файл градиента:

 compile 'com.google.android.gms:play-services-wearable:9.4.0' 

И используйте эту функцию, чтобы проверить, подключен ли носитель:

 @WorkerThread public boolean isWearableAvailable(Context context) { NotificationManagerCompat.from(context).cancel(NotificationType.WEARABLE_IN_CALL.getId()); final GoogleApiClient googleApiClient = new Builder(context).addApi(Wearable.API).build(); final ConnectionResult connectionResult = googleApiClient.blockingConnect(); if (connectionResult.isSuccess()) { NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(googleApiClient).await(); for (Node node : nodes.getNodes()) { if (node.isNearby()) return true; } } return false; }