1

TL;DR; Google+ でサインインしている場合、GoogleFit API クライアントが接続しない

だから... GoogleFitとGoogle+ APIを一緒に使用すると問題に直面しています。Google+ を使用してユーザーをサインインさせ、GoogleFit を使用してフィットネスを取得しています。

Google+ 以外にも、Facebook や Twitter などのログイン オプションがいくつかあります。私の問題は、ユーザーが Google+ でサインインしている場合、ユーザーが Google Fit クライアントに接続できなくなることです。基本的にGoogleFitに接続するボタンを押しても何も起こりません。ユーザーが Facebook または Twitter で認証された場合、GoogleFit クライアントは問題なく接続できます...

このアクティビティの関連コードを次に示します。

Google+ クライアント:

 private GoogleApiClient buildGoogleApiClient() {
    return new GoogleApiClient.Builder(this)    
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Plus.API)
            .addScope(Plus.SCOPE_PLUS_LOGIN)
            .addScope(Plus.SCOPE_PLUS_PROFILE)
            .build();
}

Google Fit クライアントでは、ユーザーがボタンを押して GoogleFit をアプリにリンクするたびに、このメソッドが呼び出されます。

public void buildFitnessClient(Button b) {
    // Create the Google API Client
    fitConnectButton = b;
    mClient = new GoogleApiClient.Builder(this)
            .addApi(Fitness.API)
            .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE))
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    mClient.connect();
}

ライフサイクルのもの:

 @Override
public void onConnected(Bundle bundle) {
    mSignInClicked = false;

    if(mGoogleServices != null) {
        Plus.PeopleApi.loadVisible(mGoogleServices, null).setResultCallback(this);
        userData = getProfileInformation();
    }
    if (hasWearDevice) mClient.connect();
}
 @Override
protected void onStart() {
    super.onStart();
    // Connect to G+ api
    if(mGoogleServices != null) mGoogleServices.connect();
    // Connect to the Fitness API
    if (hasWearDevice) mClient.connect();
}

@Override
public void onStop() {
    super.onStop();
    if(mGoogleServices != null) {
        if(mGoogleServices.isConnected()) mGoogleServices.disconnect();
    }
    if(hasWearDevice) {
        if(mClient.isConnected()) mClient.disconnect();
    }
}

助言がありますか?

4

2 に答える 2

1

クライアントごとに異なるコールバックとconnectionFailedリスナーを使用して、問題を解決しました。

GoogleFitClient の私のビルダーは、次のようになりました。

public void startFitnessClient() {
    mGoogleFitClient = new GoogleApiClient.Builder(this)
            .addApi(Fitness.API)
            .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE))
            .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle bundle) {
                    if (hasWearDevice) mGoogleFitClient.connect();
                }

                @Override
                public void onConnectionSuspended(int i) {
                    if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_NETWORK_LOST) {
                        Log.i(LOG_TAG, "Connection lost.  Cause: Network Lost.");
                    } else if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) {
                        Log.i(LOG_TAG, "Connection lost.  Reason: Service Disconnected");
                    }
                }
            })
            .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(ConnectionResult connectionResult) {
                    // The failure has a resolution. Resolve it.
                    // Called typically when the app is not yet authorized, and an
                    // authorization dialog is displayed to the user.
                    if (!authInProgress) {
                        try {
                            Log.i(LOG_TAG, "Attempting to resolve failed connection");
                            authInProgress = true;
                            connectionResult.startResolutionForResult(BaseActivity.this, REQUEST_OAUTH);
                        } catch (IntentSender.SendIntentException e) {
                            Log.e(LOG_TAG, "Exception while starting resolution activity", e);
                            Crashlytics.logException(e);
                        }
                    }
                }
            })
            .build();
}

そして、これは Google+ クライアントの私のクライアントです。

private void buildGoogleApiClient() {
    mGooglePlusClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle bundle) {
                    mSignInClicked = false;

                    if(mGooglePlusClient != null) {
                        Plus.PeopleApi.loadVisible(mGooglePlusClient, null).setResultCallback(BaseActivity.this);
                        userData = getProfileInformation();
                    }
                }

                @Override
                public void onConnectionSuspended(int i) {
                    mGooglePlusClient.connect();
                }
            })
            .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(ConnectionResult connectionResult) {
                    mConnectionResult = connectionResult;
                    if (!connectionResult.hasResolution()) {
                        GooglePlayServicesUtil.getErrorDialog(connectionResult.getErrorCode(), BaseActivity.this, 0).show();
                        return;
                    }

                    if (!mIntentInProgress) {
                        if (mSignInClicked) {
                            resolveSignInError();
                        }
                    }
                }
            })
            .addApi(Plus.API)
            .addScope(Plus.SCOPE_PLUS_LOGIN)
            .addScope(Plus.SCOPE_PLUS_PROFILE)
            .build();
}

デバッグ中にプロセスのすべてのステップをログに記録することで観察したことは、認証インテント呼び出しが内部onConnectionFailedで発生しstartResolutionForResult、Google+ クライアントが接続されたときに同じコールバック リスナーを共有していたときに、GoogleFit クライアントによってコールバックが行われなかったということです。それらの両方を分割することにより、それらが今呼び出されていることが保証されます。

于 2015-03-16T15:31:01.583 に答える
1

It's not a solution but a suggestion (I can't comment).

Maybe the problem comes from that you can be only be connected with GoogleApiClient only one time.

You are connected with Google+ scope and so when you try to connect with Fit scope it could not work because you are already connected.

Maybe you can use two types of connection :

  • One with Google Plus only
  • One with Google Plus AND Google Fit scope.

It could be like this :

mClient = new GoogleApiClient.Builder(this)
                .addApi(Plus.API)
                .addScope(Plus.SCOPE_PLUS_LOGIN)
                .addScope(Plus.SCOPE_PLUS_PROFILE)
                .addApi(Fitness.API)
                .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE))
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

Hope it could help....

于 2015-03-16T09:51:59.880 に答える