El resultado Wearable.NodeApi.getConnectedNodes nunca se llama

I desarrollo de una aplicación para Android desgaste. Debajo del código con la explicación del problema

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: Resuelvo el problema por apagar y encender mi teléfono de nuevo (Nexus 5) ¿Puede ser hay manera más fácil de resolver el problema?

Intentó agregar .await () y AsyncTask, pero el resultado es el mismo

Creo que solo puedes llamar a getConnectedNodes una vez por conexión GoogleApiClient. Desea almacenar en caché el identificador de nodo la primera vez que obtiene el resultado y, a continuación, utilice las devoluciones de llamada onPeerConnected / Disconnected () para rastrear si el ID de nodo sigue siendo relevante.

Si echa un vistazo a las muestras de desgaste de Google, hay un proyecto llamado FindMyPhone. Creo que la forma en que solucionan su problema es mucho más limpia. Comprueban si el dispositivo está conectado o desconectado con un servicio de fondo.

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

También agregan esto al archivo AndroidManifest.xml

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

Lo tengo trabajando:

Inicie el cliente de la API de Google:

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

A continuación, en su método onStart, conecte el cliente API:

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

Y para limpiar, en su método onStop:

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

Aquí está un código completo de cómo comprobarlo:

Agregue esto al archivo gradle:

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

Y utilice esta función para comprobar si un usable está conectado:

 @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; } 
  • ¿Cómo puedo dibujar iconos en una cara de reloj de un proveedor de complicaciones de desgaste de Android?
  • Android Wear: accede a las preferencias compartidas para móviles
  • ¿Android Wear 5.1 gesto de muñeca API?
  • Fragmento en la ronda Desgaste reloj girando en negro en el emulador / reloj
  • Android Studio Wear App Error - No se puede abrir PNG
  • Android Wear genera dos apk
  • ¿Hay algún método para comprobar si Android Wear está desgastado o no?
  • Android Wear: Programe la pantalla de despertador
  • Android Wear: Sólo la mira "Simple" está funcionando, todas las otras negras
  • Wear App y con tipo de compilación personalizado con applicationIdSuffix
  • Obtener la entrada de voz de Android Wearable
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.