web-dev-qa-db-ja.com

すべてのアクティビティでGoogleApiClientオブジェクトにアクセスする

これは、アプリケーションでGoogle Plusサインインを使用したい場合にほとんどの人が必要とする単純なもののようです:s。

アクティビティ1:

ユーザーをサインインします。

サインイン後、そのユーザーオブジェクトをグローバルにアクセスできるようにするため、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;
    }
}

そのようにバインドすることによって:

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

ただし、アクティビティ2でアクセスしようとすると、

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

エラーが発生します:

E/GMPM: getGoogleAppId failed with status: 10

誰かがこれを達成するための適切な方法について私に記入してくれますか?そのユーザーオブジェクトをすべてのクラスで利用できるようにしたいのですが、これに時間をかけすぎました:|。

私はどこかで失敗しましたか?あ...

編集:アクティビティ1のクライアント作成コード

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

私はGitリポジトリから直接Googleのコードを使用しています。正常にサインインし、アクティビティ1でアカウント情報を取得します。

13
Kris

マニフェストファイルにGoogle Play位置情報サービスの依存関係と位置情報の権限を追加します

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

注:このサブクラスの完全修飾名をAndroidManifest.xmlのタグの「Android:name」属性として指定することを忘れないでください。

コールバックによってapiClientを取得し、いつ接続するかを取得できます

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

または、このように取得することもできます

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

すべての場所からオブジェクトにアクセスするには、ここで行ったように行うことができます App.Java 。そのようなマニフェストにアプリを追加することを忘れないでください

<application
        Android:name=".App"

オブジェクトにアクセスするには、どこからでもそれを実行します

App.getGoogleApiHelper();

ここに私のGoogleApiHelperクラスもチェックアウトしてください GoogleApiHelper.Java

GooglePlus Apiについては、この GooglePlusAPI を確認してください。次の手順を実行します。

あなたのコードに応じたアプリコード

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

初期化してアクセスする

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

アクティビティ1でApplicationオブジェクトを取得しようとしているときは、次のようにする必要があります。

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

次に、GoogleApiClientメソッドを使用してsetClientオブジェクトを設定します。あなたのactivity2で同じ方法を使用してApplicationオブジェクトを取得します。

0
Rahil2952