Dostęp do obiektu GoogleApiClient we wszystkich działaniach

Wydaje się to prostą rzeczą, której większość ludzi potrzebowałaby, gdyby chcieli korzystać z Google Plus Zaloguj się za pomocą swojej aplikacji: s.

W Ćwiczeniu 1:

Wpisuję użytkownika.

Po zalogowaniu chcę, aby ten obiekt użytkownika był dostępny globalnie, więc dodaję go do obiektu aplikacji:

public class GlobalUserAccess extends Application {

    private GoogleApiClient mGoogleApiClient;

    public GlobalUserAccess(){
        mGoogleApiClient = null;
    }

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

    public GoogleApiClient getClient(){
        return mGoogleApiClient;
    }
}

Wiążąc go w ten sposób:

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

Jednak, kiedy próbuję uzyskać do niego dostęp w ćwiczeniu 2:

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

Dostaję błąd:

E/GMPM: getGoogleAppId failed with status: 10
Czy ktoś może wprowadzić mnie w właściwą drogę, by to osiągnąć? Chciałbym mieć ten obiekt użytkownika Dostępny dla wszystkich klas i spędziłem nad tym zbyt wiele czasu :|.

Czy ja coś schrzaniłem? Ah...

EDIT: kod tworzenia klienta z aktywności 1

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

Używam kodu Googles bezpośrednio z ich repozytorium Git. Pomyślnie zaloguje się i otrzyma informacje o koncie w ćwiczeniu 1.

Author: Kris, 2015-10-28

3 answers

Dodaj zależność usług lokalizacji google play i uprawnienia lokalizacji w pliku manifestu

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

Uwaga: nie zapomnij podać w pełni kwalifikowanej nazwy tej podklasy jako atrybutu "android: name" W AndroidManifest.znacznik xml.

Możesz uzyskać apiClient przez callback i uzyskać, gdy połączy

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

Lub możesz też dostać to tak

if(App.getGoogleApiHelper().isConnected())
{
    //Get google api client from anywhere
    GoogleApiClient client = App.getGoogleApiHelper().getGoogleApiClient();
}
 25
Author: Sabeeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-21 04:57:02

Aby uzyskać dostęp do obiektu z każdego miejsca, możesz zrobić tak, jak ja tutaj App.java . Nie zapomnij dodać aplikacji w manifeście w ten sposób

<application
        android:name=".App"

Teraz, Aby uzyskać dostęp do obiektu, po prostu zrób to z dowolnego miejsca

App.getGoogleApiHelper();

Również sprawdź moją klasę GoogleApiHelper tutaj GoogleApiHelper.java

Dla GooglePlus API sprawdź to GooglePlusAPI . Wykonaj następujące czynności.

Kod aplikacji zgodnie z Twoim kodem

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

Teraz do inicjalizacji i dostępu

App.getInstance().setClient(client);
GoogleApiClient client = App.getInstance().getClient();
 3
Author: Sabeeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-28 18:36:21

W ćwiczeniu 1 podczas próby uzyskania obiektu aplikacji należy wykonać następujące czynności:

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

A następnie Ustaw obiekt GoogleApiClient za pomocą metody setClient. W swojej aktywności2 użyj tego samego sposobu, aby uzyskać obiekt aplikacji.

 0
Author: Rahil2952,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-28 18:25:58