web-dev-qa-db-fra.com

Accéder à l'objet GoogleApiClient dans toutes les activités

Cela semble être une chose simple dont la plupart des gens auraient besoin s'ils souhaitaient utiliser Google Plus, connectez-vous à leur application: s. 

Dans l'activité 1: 

Je connecte l'utilisateur dans.

Après la connexion, je souhaite rendre cet objet utilisateur accessible de manière globale. Je l'ajoute donc à l'objet Application:

public class GlobalUserAccess extends Application {

    private GoogleApiClient mGoogleApiClient;

    public GlobalUserAccess(){
        mGoogleApiClient = null;
    }

    public void setClient(GoogleApiClient client){
        mGoogleApiClient = client;
    }

    public GoogleApiClient getClient(){
        return mGoogleApiClient;
    }
}

En le liant comme ceci:

GlobalUserAccess client = ((GlobalUserAccess) getApplicationContext());
client.setClient(mGoogleApiClient);

Cependant, lorsque j'essaie d'y accéder à l'activité 2:

GlobalUserAccess client = ((GlobalUserAccess) getApplicationContext());
String currentUser = Plus.AccountApi.getAccountName(client.getClient());

Je reçois l'erreur:

E/GMPM: getGoogleAppId failed with status: 10

Quelqu'un peut-il s'il vous plaît me renseigner sur la bonne façon d'accomplir cela? J'aimerais que cet objet utilisateur soit disponible pour toutes les classes et j'ai passé trop de temps à ceci: |.

Est-ce que je me suis trompé quelque part? Ah ...

EDIT: code de création du client de l'activité 1

mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .addApi(Plus.API)
        .addScope(new Scope(Scopes.PROFILE))
        .addScope(new Scope(Scopes.EMAIL))
        .build();

J'utilise le code de Google directement à partir de leur référentiel Git. Il se connecte avec succès et récupère les informations du compte dans l'activité 1.

12
Kris

Ajouter une dépendance aux services d'emplacement Google Play et une autorisation d'emplacement dans le fichier manifeste

AndroidManifest.xml

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />

app/build.gradle

compile 'com.google.Android.gms:play-services-location:11.0.0'

GoogleApiHelper.Java

public class GoogleApiHelper implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
        private static final String TAG = GoogleApiHelper.class.getSimpleName();
        private Context context;
        private GoogleApiClient mGoogleApiClient;
        private ConnectionListener connectionListener;
        private Bundle connectionBundle;

        public GoogleApiHelper(Context context) {
            this.context = context;
            buildGoogleApiClient();
            connect();
        }

        public GoogleApiClient getGoogleApiClient() {
            return this.mGoogleApiClient;
        }

        public void setConnectionListener(ConnectionListener connectionListener) {
            this.connectionListener = connectionListener;
            if (this.connectionListener != null && isConnected()) {
                connectionListener.onConnected(connectionBundle);
            }
        }

        public void connect() {
            if (mGoogleApiClient != null) {
                mGoogleApiClient.connect();
            }
        }

        public void disconnect() {
            if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
                mGoogleApiClient.disconnect();
            }
        }

        public boolean isConnected() {
            return mGoogleApiClient != null && mGoogleApiClient.isConnected();
        }

        private void buildGoogleApiClient() {
            mGoogleApiClient = new GoogleApiClient.Builder(context)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API).build();

        }

        @Override
        public void onConnected(Bundle bundle) {
            connectionBundle = bundle;
            if (connectionListener != null) {
                connectionListener.onConnected(bundle);
            }
        }

        @Override
        public void onConnectionSuspended(int i) {
            Log.d(TAG, "onConnectionSuspended: googleApiClient.connect()");
            mGoogleApiClient.connect();
            if (connectionListener != null) {
                connectionListener.onConnectionSuspended(i);
            }
        }

        @Override
        public void onConnectionFailed(ConnectionResult connectionResult) {
            Log.d(TAG, "onConnectionFailed: connectionResult = " + connectionResult);
            if (connectionListener != null) {
                connectionListener.onConnectionFailed(connectionResult);
            }
        }

        public interface ConnectionListener {
            void onConnectionFailed(@NonNull ConnectionResult connectionResult);

            void onConnectionSuspended(int i);

            void onConnected(Bundle bundle);
        }
    }

App.Java

public class App extends Application {
    private GoogleApiHelper googleApiHelper;
    private static App mInstance;

    @Override
    public void onCreate() {
        super.onCreate();

        mInstance = this;
        googleApiHelper = new GoogleApiHelper(mInstance);
    }

    public static synchronized App getInstance() {
        return mInstance;
    }

    public GoogleApiHelper getGoogleApiHelperInstance() {
        return this.googleApiHelper;
    }
    public static GoogleApiHelper getGoogleApiHelper() {
        return getInstance().getGoogleApiHelperInstance();
    }
}

Remarque: N'oubliez pas de spécifier le nom complet de cette sous-classe en tant qu'attribut "Android: name" dans la balise de votre AndroidManifest.xml.

Vous pouvez obtenir apiClient par rappel et savoir quand il se connectera

App.getGoogleApiHelper().setConnectionListener(new GoogleApiHelper.ConnectionListener() {
            @Override
            public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

            }

            @Override
            public void onConnectionSuspended(int i) {

            }

            @Override
            public void onConnected(Bundle bundle, GoogleApiClient googleApiClient) {
                //this function will call whenever google api connected or already connected when setting listener
                //You are connected do what ever you want
                //Like i get last known location
                Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
            }
        });

Ou vous pouvez aussi l'obtenir comme ça

if(App.getGoogleApiHelper().isConnected())
{
    //Get google api client from anywhere
    GoogleApiClient client = App.getGoogleApiHelper().getGoogleApiClient();
}
25
Sabeeh

Pour accéder à un objet de partout, vous pouvez faire comme je l’ai fait ici App.Java . N'oubliez pas d'ajouter une application dans manifeste comme ça

<application
        Android:name=".App"

maintenant pour accéder à l'objet simplement le faire de n'importe où

App.getGoogleApiHelper();

Consultez également ma classe GoogleApiHelper ici GoogleApiHelper.Java

Pour GooglePlus Api, consultez ceci GooglePlusAPI . Suivez ces étapes.

Code App en fonction de votre code

public class App extends Application {
    private GoogleApiClient mGoogleApiClient;

    private static App mInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public void setClient(GoogleApiClient client){
        mGoogleApiClient = client;
    }

    public GoogleApiClient getClient(){
       return mGoogleApiClient;
    }
}

maintenant pour initialiser et accéder

App.getInstance().setClient(client);
GoogleApiClient client = App.getInstance().getClient();
3
Sabeeh

Dans votre activité 1, lorsque vous essayez d’obtenir un objet Application, procédez comme suit:

GlobalUserAccess client = ((GlobalUserAccess) getApplication());

Et ensuite, définissez l'objet GoogleApiClient à l'aide de la méthode setClient. Dans votre activité2, utilisez la même méthode pour obtenir un objet Application.

0
Rahil2952