3

Я получаю множество сообщений об аварии моего приложения при попытке использовать Plus 'People Api для доступа к основным данным профиля пользователя ,GoogleApiClient имеет дополнительный файл Plus.API и не подключен к Plus с новым знаком Google, введенным в Play Services. 8.3

Вот моя установка GoogleApiClient

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
        .requestEmail() 
        .requestScopes(new Scope(Scopes.PROFILE)) 
        .requestScopes(new Scope(Scopes.PLUS_LOGIN)) 
        .requestIdToken(<id_token>) 
        .requestProfile() 
        .build(); 

mGoogleApiClient = new GoogleApiClient.Builder(this) 
        .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
        .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
        .addApi(Plus.API) 
        .addConnectionCallbacks(this) 
        .build(); 

Получение IllegalStateException на этой линии:

Person person = Plus.PeopleApi.getCurrentPerson(mGoogleApiClientPlus) 

java.lang.IllegalStateException: GoogleApiClient имеет дополнительный Plus.API и не подключен к плюсу. Используйте GoogleApiClient.hasConnectedApi (Plus.API), чтобы защитить этот вызов.

Этот код вызывается только после того, как google sign возвращается с подписанным пользователем. Так почему же не связан плюс апи?

ответ

1

Вы можете попробовать использовать следующие вместо (конечно, убедитесь, что учетная запись вашего Google имеет профиль Google+ уже):

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestScopes(new Scope(Scopes.PLUS_LOGIN)) 
       .requestEmail() 
       .build(); 


mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .addApi(Plus.API) 
       .build(); 

Пожалуйста, обратите внимание на my sample project at GitHub. Надеюсь, поможет!

+0

Вы запрашиваете область с дополнительным доступом, но не обрабатывается ли она автоматически при добавлении Plus Api к клиенту API Google? –

+0

Pls читает https://developers.google.com/android/reference/com/google/android/gms/common/Scopes.html#PLUS_LOGIN – BNK

+0

Спасибо, что поделились ссылкой. Я добавил эту область в gso. Тем не менее, он все еще сбой с тем же самым исключением при первом входе в систему, когда пользователь спрашивает о разрешениях в потоке входа. Я отключу приложение и повторю попытку, он работает и не показывает мне диалог разрешения. Но он должен отображать диалоговое окно с разрешением, например, это первый вход в систему. Таким образом, приложение не отключается, и я не могу повторить тест. Какие-нибудь советы здесь? –

4
protected synchronized void buildGoogleApiClient() { 
    // Configure sign-in to request the user's ID, email address, and basic profile. 
    // ID and basic profile are included in DEFAULT_SIGN_IN. 
    gGoogleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestScopes(new Scope(Scopes.PROFILE)) 
      .requestScopes(new Scope(Scopes.PLUS_LOGIN)) 
      .requestProfile() 
      .requestEmail() 
      .build(); 

    // Build a GoogleApiClient with access to the Google Sign-In API 
    // and the options specified by gGoogleSignInOptions. 
    gGoogleApiClient = new GoogleApiClient.Builder(this) 
      .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, mGoogleSignInOptions) 
      .addApi(Plus.API) 
      .build(); 
} 


@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
    if (requestCode == RC_SIGN_IN) { 
     if (resultCode == Activity.RESULT_OK) { 
      // Google+ 
      if (gGoogleApiClient.hasConnectedApi(Plus.API)) 
       Person person = Plus.PeopleApi.getCurrentPerson(gGoogleApiClient); 
      else 
       Log.e("TAG", "Google+ not connected"); 

      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      handleSignInResult(result); 
     } else 
      Log.e("TAG", "Result Cancelled"); 
    } 
} 
Смежные вопросы