update studio services play google gms failed android google-play-services google-api-client android-googleapiclient

android - studio - google api client location



GoogleApiClient está lanzando "GoogleApiClient aún no está conectado" DESPUÉS de que se llame a la función Conectado (8)

Así que encontré algo que no está muy claro para mí sobre GoogleApiClient. GoogleApiClient tiene una función llamada onConnected que se ejecuta cuando el cliente está conectado (seguro)

Obtuve mi propia función llamada: startLocationListening, que finalmente se llama en la función onConnected de GoogleApiClient .

Por lo tanto, mi función startLocationListening no se pudo ejecutar sin una conexión GoogleApiClient.

Código y registro:

@Override public void onConnected(Bundle bundle) { log("Google_Api_Client:connected."); initLocationRequest(); startLocationListening(); //Exception caught inside this function }

...

private void startLocationListening() { log("Starting_location_listening:now"); //Exception caught here below: LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); }

La excepción es:

03-30 12:23:28.947: E/AndroidRuntime(4936): java.lang.IllegalStateException: GoogleApiClient is not connected yet. 03-30 12:23:28.947: E/AndroidRuntime(4936): at com.google.android.gms.internal.jx.a(Unknown Source) 03-30 12:23:28.947: E/AndroidRuntime(4936): at com.google.android.gms.common.api.c.b(Unknown Source) 03-30 12:23:28.947: E/AndroidRuntime(4936): at com.google.android.gms.internal.nf.requestLocationUpdates(Unknown Source) 03-30 12:23:28.947: E/AndroidRuntime(4936): at hu.company.testproject.service.GpsService.startLocationListening(GpsService.java:169) 03-30 12:23:28.947: E/AndroidRuntime(4936): at hu.company.testproject.service.GpsService.onConnected(GpsService.java:259)

...

Mi registro de depuración también dice que se llamó a la función onConnected :

03-30 12:23:28.847: I/Locationing_GpsService(4936): Google_Api_Client:connected. 03-30 12:23:28.857: I/Locationing_GpsService(4936): initLocationRequest:initing_now 03-30 12:23:28.877: I/Locationing_GpsService(4936): initLocationRequest:interval_5000 03-30 12:23:28.897: I/Locationing_GpsService(4936): initLocationRequest:priority_100 03-30 12:23:28.917: I/Locationing_GpsService(4936): Starting_location_listening:now

Después de esto obtuve la excepción.

¿Me estoy perdiendo de algo? Recibí una respuesta para "conectado", ejecuté mi func y recibí el error "no conectado" ¿qué es esto? Además, una cosa molesta es: utilicé este servicio de ubicación durante semanas y nunca recibí este error.

EDITAR:

Agregué una salida de registro más específica, simplemente me volví loco, mira esto:

@Override public void onConnected(Bundle bundle) { if(mGoogleApiClient.isConnected()){ log("Google_Api_Client: It was connected on (onConnected) function, working as it should."); } else{ log("Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged."); } initLocationRequest(); startLocationListening(); }

salida de registro en este caso:

03-30 16:20:00.950: I/Locationing_GpsService(16608): Google_Api_Client:connected. 03-30 16:20:00.960: I/Locationing_GpsService(16608): Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.

Sí, acabo de recibir mGoogleApiClient.isConnected() == false dentro de onConnected() ¿cómo es posible?

EDITAR:

Como nadie podía responder a esto ni siquiera con la recompensa de reputación, decidí informar de esto como un error a Google. Lo que vino después me sorprendió mucho. Respuesta oficial de Google para mi informe:

"Este sitio web es para problemas del desarrollador con el código fuente de Android AOSP y el conjunto de herramientas del desarrollador, no con las aplicaciones o servicios de Google, como los servicios de Play, GMS o API de Google. Desafortunadamente, no parece haber un lugar apropiado para informar errores con Play Services . Todo lo que puedo decir es que este sitio web no lo es, lo siento. Intente publicar en los foros de productos de Google ".

Informe completo del problema aquí. (Espero que no lo quiten solo porque es una tontería)

Así que sí, eché un vistazo a los foros de productos de Google y no pude encontrar ningún tema para publicar esto, por lo que en este momento Iam estaba desconcertado y atascado.

¿Alguien en el planeta tierra podría ayudarme con esto?

EDITAR:

Código completo en pastebin


Acabo de notar que estás creando googleApiClient en onStartCommand (). Esto parece una mala idea.

Digamos que su servicio se activa dos veces. Se crearán dos objetos googleApiClient, pero solo tendrá referencia a uno. Si aquel cuya referencia no tiene ejecuta su devolución de llamada a onConnected (), estará conectado en ese cliente, pero el cliente cuya referencia sí tiene todavía podría estar desconectado.

Sospecho que eso es lo que está pasando. Intente mover su creación de googleApiClient a onCreate y vea si obtiene el mismo comportamiento.


Creo que encontré la raíz del problema y no tiene nada que ver con la API. Me he enfrentado a esto emitido cada vez que instalo la aplicación. Por cierto, al igual que el comentario más popular, solo tengo un googleApiClient después de pausar y reanudar. Lo que noté es que aparece la solicitud de permiso para obtener acceso de geolocalización. Como sabe en su actividad, esto se convertirá en una pausa, y una vez que la ventana emergente desaparezca, reanudará su actividad. Lo más probable es que su googleClient también esté encadenado a esos eventos para desconectarse y conectarse. Puede decir que no hay conexión una vez que se acepta el permiso y está a punto de realizar la tarea googleApiClient.

if(googleApiClient.isConnected()){ rxPermissions .request(Manifest.permission.ACCESS_FINE_LOCATION) .subscribe(granted -> { if (granted) { //here it could be client is already disconnected!! _geolocateAddress(response); } else { // Oups permission denied } }); }

Puede omitir la desconexión y la conexión al establecer una marca que sea verdadera antes del permiso y una vez que la tarea googleApiClient se haya completado o granted sea ​​falsa.

if(googleApiClient.isConnected()){ isRequestingPermission = true; rxPermissions .request(Manifest.permission.ACCESS_FINE_LOCATION) .subscribe(granted -> { if (granted && googleApiClient.isConnected()) { //Once the task succeeds or fails set flag to false //at _geolocateAddress _geolocateAddress(response); } else { // Oups permission denied isRequestingPermission = false; } }); }

También podríamos dividirnos haciendo solo el permiso, y si se le otorga, realice la llamada de la tarea. Ok, voy a confesar que estoy usando un fragmento, y reinstalé la aplicación, incluso roté la pantalla en los permisos y una vez concedido, apareció el resultado. Espero que esto ayude a otras personas.

  • No tiene que desinstalar la aplicación. Simplemente vaya a configuración / administrador de aplicaciones / su aplicación / permisos y apague cualquiera, luego pruebe la aplicación nuevamente.

Tuve el mismo error, pero mi problema era diferente de la respuesta de iheanyl:

Había declarado el googleApiClient estático. Esto evitó que Android cerrara el servicio.


Tuve este problema cuando accidentalmente pero googleApiClient.connect () en oncreate y onresume. Solo lo eliminé de oncreate.


Tuve este problema y lo resolví declarando googleApiClient como objeto estático


llame al método connect () en el método onStart ()

@Override protected void onStart() { super.onStart(); // Call GoogleApiClient connection when starting the Activity googleApiClient.connect(); } @Override protected void onStop() { super.onStop(); // Disconnect GoogleApiClient when stopping Activity googleApiClient.disconnect(); }


mover la creación de googleApi a onCreate resolvió el problema por mí.


https://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html

Debe crear una instancia de un objeto de cliente en el método onCreate (Bundle) de su Actividad y luego llamar a connect () en onStart () y desconectar () en onStop (), independientemente del estado.

La implementación de GoogleApiClient parece diseñada para una sola instancia. Es mejor instanciarlo solo una vez en onCreate, luego realizar conexiones y desconexiones usando la instancia única.