web-dev-qa-db-fra.com

GoogleApiClient lance "GoogleApiClient n'est pas encore connecté" APRES que la fonction onConnected soit appelée

J'ai donc trouvé quelque chose qui n'est pas très clair pour moi à propos de GoogleApiClient. GoogleApiClient a une fonction appelée onConnected qui est exécutée lorsque le client est connecté (pour sûr)

J'ai ma propre fonction appelée: startLocationListening qui est finalement appelée par la fonction onConnected de GoogleApiClient.

Ainsi, ma fonction startLocationListening ne pouvait pas s'exécuter sans connexion GoogleApiClient.

Code et log:

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

L'exception est:

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)

...

Mon journal de débogage indique également que la fonction onConnected a été appelée :

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

Après cela, j'ai eu l'exception.

Est-ce que j'ai râté quelque chose? J'ai eu une réponse pour "connecté" J'ai couru mon func, et j'ai eu l'erreur "non connecté" whats this? De plus, il y a un inconvénient: j'ai utilisé ce service de localisation pendant des semaines et je n'ai jamais eu cette erreur.

E D I T:

J'ai ajouté une sortie de journal plus spécifique, j'ai juste eu le vertige, regardez ceci:

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

enregistrer la sortie dans ce cas:

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.

Oui, je viens de recevoir mGoogleApiClient.isConnected() == false à l'intérieur de onConnected() comment est-ce possible?

E D I T:

Étant donné que personne ne pouvait répondre à cette question, même avec une prime de réputation, , j’ai décidé de signaler cette anomalie à Google. Ce qui a suivi est très surprenant. Réponse officielle de Google à mon rapport:

"Ce site Web concerne les problèmes de développeur liés à l'AOSP Android et aux outils de développement, pas les applications ou services Google, tels que les services Play, GMS ou les API Google. Malheureusement, il ne semble pas exister Un endroit approprié pour signaler des bogues avec Play Services. Tout ce que je peux dire, c'est que ce site Web ne le soit pas, désolé. Essayez de poster sur les forums des produits Google. "

Numéro complet rapport ici. (J'espère qu'ils ne l'enlèveront pas juste parce que c'est idiot)

Donc, oui, j’ai jeté un coup d’œil aux forums sur les produits Google et je n’ai trouvé aucun sujet pour publier cette annonce. Pour le moment, je suis perplexe et bloquée.

Quelqu'un sur la planète Terre pourrait-il m'aider avec cela?

E D I T:

Code complet dans Pastebin

74
Adam Varhegyi

Je viens de remarquer que vous créez le googleApiClient dans onStartCommand (). Cela semble être une mauvaise idée.

Disons que votre service se déclenche deux fois. Deux objets googleApiClient seront créés, mais vous n’y référerez qu’un seul. Si celui dont vous n'avez pas la référence exécute son rappel sur onConnected (), vous serez connecté dans ce client, mais le client dont vous avez la référence peut toujours être déconnecté.

Je soupçonne que c'est ce qui se passe. Essayez de déplacer votre création googleApiClient vers onCreate et voyez si vous obtenez le même comportement.

85
iheanyi

J'ai eu la même erreur, mais mon problème était différent de la réponse de iheanyl:

J'avais déclaré le statique googleApiClient. Cela empêchait Android d’arrêter le service.

2
Paamand

J'ai eu ce problème et je l'ai résolu en déclarant googleApiClient comme objet statique

1
Amine Choukri

Je pense avoir trouvé la racine du problème et cela n'a rien à voir avec l'API. J'ai été confronté à ce problème chaque fois que j'installais l'application. Au fait, tout comme le commentaire le plus populaire, je n'ai qu'un seul googleApiClient à la pause et à la reprise. Ce que j'ai remarqué, c'est que la demande d'autorisation pour obtenir un accès à la géolocalisation apparaît. Comme vous le savez dans votre activité, cela se transformera en une pause et une fois que le popup aura disparu, il reprendra votre activité. Il est fort probable que votre googleClient soit également lié à ces événements pour se déconnecter et se connecter. Vous pouvez savoir qu'il n'y a plus de connexion une fois l'autorisation acceptée et que vous êtes sur le point d'effectuer la tâche 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
                    }
                });
    }

Vous pouvez ignorer la déconnexion et la connexion lorsque vous définissez un indicateur qui est true avant l'autorisation et une fois que la tâche googleApiClient est terminée ou granted est 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;
                    }
                });
    }

Nous pourrions également scinder la permission de faire seule, et si elle est accordée, appeler la tâche. Ok, je vais avouer que j'utilise un fragment, et j'ai réinstallé l'application en faisant pivoter l'écran sur les permissions et une fois accordé, le résultat s'affichait. J'espère que cela aide d'autres personnes.

  • Vous n'êtes pas obligé de désinstaller l'application. Allez simplement dans setting/gestionnaire d'application/votre application/autorisations et désactivez-les, puis testez à nouveau l'application.
0
Juan Mendez

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

Vous devez instancier un objet client dans la méthode onCreate (Bundle) de votre activité, puis appeler connect () dans onStart () et disconnect () dans onStop (), quel que soit l'état.

L'implémentation de GoogleApiClient semble conçue pour une seule instance. Il est préférable de ne l'instancier qu'une seule fois dans onCreate, puis d'effectuer des connexions et des déconnexions à l'aide d'une seule instance.

0
Naveen Kumar M

appelez la méthode connect () dans la méthode 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
user6250541