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

4 Solutions collect form web for “El resultado Wearable.NodeApi.getConnectedNodes nunca se llama”

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; } 
  • Android Wear: Actividad de notificación incrustada no iniciada en el emulador
  • El cuadro de selección de dispositivos Android Wear dice "localhost offline: 4444 minSdk (API 20)> deviceSdk (API 1)"
  • Adición dinámica de elementos a FragmentGridPagerAdapter
  • Envío de datos al dispositivo de desgaste de Android
  • La imagen de fondo de la notificación nunca se muestra en el reloj
  • La imagen no está centrada en ActionPage en el dispositivo de desgaste androide 320x320
  • ¿Conexión directa a Internet en Android Wear?
  • Cómo deslizar la actividad en Android aplicaciones de desgaste?
  • Los paquetes de desgaste de Android no funcionan
  • Sincronizar la aplicación móvil con Android Wear
  • ¿Cuál es la mejor práctica para compartir clases entre una aplicación de Wear y Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.