it-swarm.com.de

Zugriff auf das GoogleApiClient-Objekt in "Alle Aktivitäten"

Dies scheint eine einfache Sache zu sein, die die meisten Leute benötigen würden, wenn sie Google Plus verwenden möchten, um sich mit ihrer Anwendung anzumelden: s. 

In Tätigkeit 1: 

Ich melde den Benutzer an.

Nach der Anmeldung möchte ich das Benutzerobjekt global zugänglich machen, also füge ich es dem Anwendungsobjekt hinzu:

public class GlobalUserAccess extends Application {

    private GoogleApiClient mGoogleApiClient;

    public GlobalUserAccess(){
        mGoogleApiClient = null;
    }

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

    public GoogleApiClient getClient(){
        return mGoogleApiClient;
    }
}

Indem ich es so binde:

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

Wenn ich jedoch versuche, in Aktivität 2 darauf zuzugreifen:

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

Ich bekomme den Fehler:

E/GMPM: getGoogleAppId failed with status: 10

Kann jemand mich bitte auf die richtige Weise ausfüllen, um dies zu erreichen? Ich möchte dieses Benutzerobjekt für alle Klassen zur Verfügung haben, und ich habe viel zu viel Zeit damit verbracht: |.

Habe ich irgendwo versaut? Ah...

BEARBEITEN: Client-Erstellungscode aus Aktivität 1

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

Ich verwende Googles-Code direkt aus ihrem Git-Repository. Er meldet sich erfolgreich an und erhält die Kontoinformationen in Aktivität 1.

12
Kris

Fügen Sie die Google Play-Standortabhängigkeitsdienste und die Standortberechtigung in der Manifestdatei hinzu

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

Hinweis: Vergessen Sie nicht, den vollständig qualifizierten Namen dieser Unterklasse als Attribut "Android: name" in Ihrem AndroidManifest.xml-Tag anzugeben.

Sie können apiClient per Rückruf abrufen und erhalten, wann die Verbindung hergestellt wird

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

Oder Sie können es auch so bekommen

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

Für den Zugriff auf Objekte von überall aus können Sie wie hier App.Java . Vergessen Sie nicht, eine App in diesem Format hinzuzufügen

<application
        Android:name=".App"

um nun auf das Objekt zuzugreifen, machen Sie das einfach von überall

App.getGoogleApiHelper();

Checke auch meine GoogleApiHelper-Klasse hier GoogleApiHelper.Java

Für GooglePlus Api checken Sie diese GooglePlusAPI aus. Folge diesen Schritten.

App-Code gemäß Ihrem 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;
    }
}

jetzt zu initialisieren und zuzugreifen

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

Wenn Sie in Ihrer Aktivität 1 versuchen, ein Anwendungsobjekt zu erhalten, sollten Sie Folgendes tun:

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

Setzen Sie dann das GoogleApiClient-Objekt mit der setClient-Methode. Verwenden Sie in Ihrer activity2 auf dieselbe Weise, um ein Anwendungsobjekt abzurufen.

0
Rahil2952