Несколько GoogleApiClient не запускают соединение ()

TL;ДР; Клиент GoogleFit Api не подключается, если выполнен вход в Google+

Итак... У меня возникла проблема при совместном использовании API GoogleFit и Google+. Я использую 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();
    }
}

Какие-либо предложения?


person Marcus Gabilheri    schedule 14.03.2015    source источник


Ответы (2)


Это не решение, а предложение (не могу комментировать).

Возможно, проблема в том, что вы можете подключиться к GoogleApiClient только один раз.

Вы подключены к Google+ Scope, поэтому при попытке подключиться к Fit Scope это не сработает, потому что вы уже подключены.

Возможно, вы можете использовать два типа подключения:

  • Один только с Google Plus
  • Один с Google Plus и Google Fit.

Это может быть так:

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

Надеюсь, это могло помочь....

person Piotr    schedule 16.03.2015

В итоге я решил свои проблемы, используя разные прослушиватели обратного вызова и 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. клиент. Разделив их обоих, мы гарантируем, что их вызывают сейчас.

person Marcus Gabilheri    schedule 16.03.2015