GoogleApiClient имеет необязательный Plus.API и не подключен к Plus с новым знаком Google, представленным в Play Services 8.3.

Я получаю много сообщений о сбое моего приложения при попытке использовать Plus People Api для доступа к базовой информации профиля пользователя.

Вот моя настройка 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 и не подключен к Plus. Используйте GoogleApiClient.hasConnectedApi(Plus.API) для защиты этого вызова.

Этот код вызывается только после входа в систему Google с зарегистрированным пользователем. Так почему не подключается плюс апи?


person Rahul Sainani    schedule 18.12.2015    source источник


Ответы (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();

Ознакомьтесь с моим примером проекта на GitHub. Надеюсь, поможет!

person BNK    schedule 18.12.2015
comment
Вы запрашиваете область входа Plus, но разве это не обрабатывается автоматически, когда вы добавляете Plus Api в клиент Google API? - person Rahul Sainani; 21.12.2015
comment
Пожалуйста, прочитайте developers.google.com/ android/reference/com/google/android/gms/ - person BNK; 21.12.2015
comment
Спасибо, что поделились ссылкой. Я добавил эту область в gso. Тем не менее, он по-прежнему дает сбой с тем же исключением при первом входе в систему, когда пользователя спрашивают о разрешениях в процессе входа в систему. Я отключаю приложение и пытаюсь снова, оно работает и не показывает мне диалоговое окно разрешения. Но он должен отображать диалоговое окно разрешений, как при первом входе в систему. Итак, приложение не отключается, и я не могу снова протестировать его. Любые советы здесь? - person Rahul Sainani; 21.12.2015
comment
убедитесь, что в вашей учетной записи Google уже есть профиль Google+. with the same exception when logging in for the first time какое исключение? Еще одна вещь, возможно, вам следует удалить эту учетную запись Google со своего телефона, а затем использовать свое приложение, чтобы повторно добавить - person BNK; 21.12.2015
comment
Да, у моего аккаунта есть профиль g+. Под тем же исключением я имел в виду IllegalStateException, упомянутое в вопросе. - person Rahul Sainani; 21.12.2015
comment
Как и в моем проекте GitHub, вы можете проверить if (mGoogleApiClient.hasConnectedApi(Plus.API)) {. И попробуйте удалить эту учетную запись Google со своего телефона (Настройки-Учетные записи...), затем используйте свое приложение, чтобы повторно добавить - person BNK; 21.12.2015
comment
Да, мой вопрос был, почему я должен это проверять. Поскольку Plus API уже добавлен, а onConnected вызывается и обрабатывается игровыми сервисами, почему Plus API еще не подключен? - person Rahul Sainani; 21.12.2015
comment
Понятно, согласно developers.google.com/android/guides/api-client, нам нужно только проверить это, если мы используем addApiIfAvailable(). Однако они сказали If you call addApi() and the GoogleApiClient is unable to connect successfully to that API, the entire connection operation for that client fails and triggers the onConnectionFailed() callback.. Более того, вы можете попробовать себя в роли их гида To find out why a particular API failed to connect when the entire connection operation succeeded for the client, call getConnectionResult() and get the error code from the ConnectionResult object. - person BNK; 22.12.2015
comment
Однако вы уже пробовали hasConnectedApi и возвращали ли вы true или false? - person BNK; 22.12.2015
comment
Я только что попробовал удалить .requestScopes(new Scope(Scopes.PLUS_LOGIN)) , все еще работает. Я думаю, что если этот запрос установлен, а в учетной записи Google еще нет профиля Google+, будет отображаться G+ Создать профиль. И if (mGoogleApiClient.hasConnectedApi(Plus.API)) только для того, чтобы приложение не вылетало. IMO, вы можете проверить настройки своего профиля Google+ подробнее - person BNK; 22.12.2015
comment
Если используется .requestScopes(new Scope(Scopes.PLUS_LOGIN)) и вы ЗАПРЕЩАЕТЕ доступ при отображении диалогов, то mGoogleApiClient.hasConnectedApi(Plus.API) возвращает FALSE - person BNK; 22.12.2015
comment
Давайте продолжим обсуждение в чате. - person Rahul Sainani; 22.12.2015
comment
Решилась ли проблема? У меня та же проблема, тот же код, и я не могу найти решение в Интернете. - person Cocorico; 17.06.2016