GoogleApiClient está lanzando "GoogleApiClient no está conectado todavía" DESPUÉS de que se llame a la función onConnected


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á connected (seguro)

Tengo mi propia función llamada: startLocationListening que finalmente es llamada en la función onConnected de GoogleApiClient.

Así que mi función startLocationListening no podía ejecutarse sin un GoogleApiClient relación.

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 la función onConnected se llamó :

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 algo aquí? Obtuve una respuesta para " conectado "corrí mi func, y obtuve el error" no conectado " ¿qué es esto? Además, una cosa molesta es: Usé este servicio de ubicación durante semanas y nunca recibí esto error.

E D I T:

Agregué una salida de registro más específica, simplemente me voló la mente, 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?

E D I T:

Dado que nadie podía responder a esto, incluso con recompensa reputación, decidí informar de esto como un error a Google. Lo que vino después realmente me sorprendió. La respuesta oficial de Google para mi informe:

" Este sitio web es para problemas de desarrollador con la fuente de Android AOSP el código y el conjunto de herramientas para desarrolladores, no Google apps o servicios como Play services, GMS o API de Google. Desafortunadamente no parece que sea un lugar apropiado para reportar errores con Play Services. Todo lo que puedo digamos que este sitio web no lo es, lo siento. Prueba a publicar en Google Foros de productos en su lugar. "

Número completo informe aquí. (Espero que no lo eliminen solo porque su tonto)

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

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

E D I T:

Código Completo en pastebin

Author: Adam Varhegyi, 2015-03-30

8 answers

Acabo de notar que estás creando el 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ás referencia a uno. Si el cliente cuya referencia no tienes ejecuta su devolución de llamada a onConnected (), estarás conectado en ese cliente, pero el cliente cuya referencia realmente tienes todavía podría estar desconectado.

Sospecho que eso es lo que es continúa. Intente mover su creación de GoogleApiClient a onCreate y vea si obtiene el mismo comportamiento.

 79
Author: iheanyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-03 22:55:57

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

Había declarado la estática GoogleApiClient. Esto evitó que Android cerrara el servicio.

 2
Author: Paamand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-29 14:19:34

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

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

La implementación de GoogleApiClient aparece diseñada para una sola instancia. Es mejor instanciarlo solo una vez en onCreate, luego realizar conexiones y desconexiones mediante una sola instancia.

 0
Author: Naveen Kumar M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-19 04:35:55

Llama 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();
       }
 0
Author: user555,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 14:25:02

Creo que encontré la raíz del problema y no tiene nada que ver con la API. Me he enfrentado a este emitido cada vez que instalo la aplicación. Por cierto, al igual que el comentario más popular, solo tengo un GoogleApiClient en pausa y reanudar. Lo que noté es que la solicitud de permiso para obtener acceso a geolocalización aparece. Como sabes en tu actividad, esto se va a convertir en una pausa, y una vez que la ventana emergente se haya ido, reanuda tu actividad. Lo más probable es que su googleClient también esté encadenado a aquellos eventos para desconectar y conectar. Puede saber 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 a medida que establece un indicador que es true antes del permiso y una vez que se complete la tarea GoogleApiClient o granted es false.

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 dividir haciendo permiso solo, y si se concede entonces hacer la llamada a la tarea. Ok, voy a confesar que estoy usando un fragmento, y reinstalado la aplicación incluso giró la pantalla en los permisos y una vez concedido, el resultado apareció. Espero que esto ayude a otras personas.

  • No es necesario desinstalar la aplicación. Simplemente vaya a configuración / administrador de aplicaciones / su aplicación/ permisos y desactive cualquiera, luego vuelva a probar la aplicación.
 0
Author: Juan Mendez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-02 05:13:09

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

 0
Author: Amine Choukri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-20 16:34:40

Tuve este problema cuando accidentalmente pero GoogleApiClient.connect () en oncreate y onresume. Acabo de quitarlo de oncreate.

 -1
Author: Tooroop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-31 07:03:51

Mover la creación de googleApi a onCreate resolvió el problema para mí.

 -4
Author: user2956331,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-16 19:36:13