OnConnectionFailed дает SIGN_IN_REQUIRED (4)
Я разрабатываю приложение для Android, где я хочу использовать Google API. Для этого я импортировал проект google-play-service-lib.
Я следую этой ссылке для инициализации объекта GoogleApiClient.
Мой код:
1) В методе onCreate()
я создаю объект GoogleApiClient:
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API, null)
.addScope(Plus.SCOPE_PLUS_LOGIN)
.build();
2) В onStart()
я вызываю mGoogleApiClient.connect()
.
3) Моя деятельность
ConnectionCallbacks и OnConnectionFailedListener.
4) Мой метод onConnectionFailed()
выглядит следующим образом:
public void onConnectionFailed(ConnectionResult result) {
//in dubug result looks like : ConnectionResult{
//statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent
// {41f8ca70: [email protected]}}
try {
if(!mIntentInProgress && result.hasResolution())
{
mIntentInProgress=true;
result.startResolutionForResult(mActivity, RC_SIGN_IN);
}
} catch (SendIntentException e) {
e.printStackTrace();
}
}
5) Мой метод onActivityResult()
содержит:
if (requestCode == RC_SIGN_IN) {
if (!mGoogleApiClient.isConnecting()) {
mGoogleApiClient.connect();
}
}
Когда я запускаю свое приложение, я получаю тост, который говорит, что появилась внутренняя ошибка. Я создал проект в консоли Google.
Ответы
Ответ 1
У меня была та же проблема.
Из документации:
Клиент может продолжить работу без использования API или может вызвать startResolutionForResult (Activity, int), чтобы пригласить пользователя войти в систему.
Итак, вы должны попытаться войти с помощью функции startResolutionForResult()
@Override
public void onConnectionFailed(ConnectionResult result) {
if (result.hasResolution()) {
try {
// !!!
result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
} catch (SendIntentException e) {
mPlusClient.connect();
}
}
mConnectionResult = result;
}
Ответ 2
Просто следуйте google инструкции
И ПРЕДОСТЕРЕЖЕНИЕ
Поскольку вы все еще находитесь в режиме разработки, проверьте, добавили ли вы свой тестовый адрес электронной почты в центр ИДЕНТИФИКАТОРЫ, прежде чем опубликовать игру.
Ответ 3
Убедитесь, что вы подписываете приложение с хранилищем ключей, которое находится в apk, загруженном в консоль разработчика Google Play (при тестировании вы можете загружать как альфа и публиковать, сохраняя при этом конфиденциальность).
Если это не так, это могут быть другие вещи. Убедитесь, что адрес электронной почты вашего аккаунта указан в тестерах на странице сведений о счете (в меню настроек с значком шестеренки), а лицензионный ответ установлен в ЛИЦЕНЗИРОВАН, а не в RESPOND_NORMALLY
Ответ 4
Эта ошибка указывает, что пользователю необходимо авторизовать ваше приложение. Там полный рабочий процесс для этого, следуя руководству в https://developers.google.com/+/mobile/android/getting-started искать "onConnectionFailed"
Ответ 5
Дисковод api должен быть включен с консоли.
Ответ 6
Не уверен, что это лучший ответ, но это сработало для меня. Я скопировал onConnectionFailed() из BasicSamples TakeANumber MainActivity. Он вызывает BaseGameUtils для разрешения. Конечно, это означает, что у вас есть библиотека BaseGameUtils, включенная в ваш проект, а другая может быть червями. Но, возможно, вы можете пройти одним методом, поэтому я скопировал его ниже.
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
logger.info( "onConnectionFailed() *play* : attempting to resolve");
if (mResolvingConnectionFailure) {
logger.info( "onConnectionFailed(): already resolving");
return;
}
if (mSignInClicked || mAutoStartSignInFlow) {
mAutoStartSignInFlow = false;
mSignInClicked = false;
mResolvingConnectionFailure = true;
if (!BaseGameUtils.resolveConnectionFailure(this, mGoogleApiClient, connectionResult,
RC_SIGN_IN, getString(R.string.signin_other_error))) {
mResolvingConnectionFailure = false;
}
}
}
Из Google BasicSamples BaseGameUtils.java:
public static boolean resolveConnectionFailure(Activity activity,
GoogleApiClient client, ConnectionResult result, int requestCode,
String fallbackErrorMessage) {
if (result.hasResolution()) {
try {
result.startResolutionForResult(activity, requestCode);
return true;
} catch (IntentSender.SendIntentException e) {
// The intent was canceled before it was sent. Return to the default
// state and attempt to connect to get an updated ConnectionResult.
client.connect();
return false;
}
} else {
// not resolvable... so show an error message
int errorCode = result.getErrorCode();
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(errorCode,
activity, requestCode);
if (dialog != null) {
dialog.show();
} else {
// no built-in dialog: show the fallback error message
showAlert(activity, fallbackErrorMessage);
}
return false;
}
}
Ответ 7
если вы не используете отладочные ключи, нажмите приложение для игры в Google как альфа, добавьте себя в качестве тестера и главное - следуйте ссылке "Отключить" на странице Aplha и ПОДТВЕРДИТЕ, что вы являетесь тестером.
Ответ 8
Я хотел бы поделиться своим опытом с этим. Мое дело было при использовании сервисов Google Play для игр в Google Play. Я также получал onConnectionFailed, выдавая ошибку SIGN_IN_REQUIRED. Наконец, я понимаю, что у меня не было "Опубликовал" настройки моей игры в консоли разработчика. Не ошибиться при публикации "альфа" или "бета" версии вашего apk. Я имею в виду настоящую игру Google Play "Игра", которую вы создаете и ссылаетесь на игру APK.
Ответ 9
У меня была такая же проблема и я решил это решение,
У меня на самом деле была очень старая версия google play-services library, поэтому я обновил ее с последней библиотекой игровых сервисов google для компилировать 'com.google.android.gms: play-services: 11.0.4' из моего библиотека предыдущей версии для поддержки вашего SDK android и поддержка compileSDKVersion и targetSDKVersion в gradle: приложение.
добавьте google-диск с включенным API_KEY в manifest.and повторите попытку
Ответ 10
по моей причине я ошибочно использовал ключ выпуска SHA1 для генерации API в консоли разработчика.
Затем создайте ключ SHA1 с debug.keystore и обновите мои учетные данные api.
Его начали работать.
keytool -list -v -keystore "C:\Users\<user>n\.android\debug.keystore" -alias androiddebugkey -storepass andro
id -keypass android
Ответ 11
В моем случае проблема была в добавленных чувствительных областях и не проверенных:
https://console.developers.google.com/apis/credentials Учетные данные → Экран согласия OAuth → Области применения для API Google
Убедитесь, что у вас нет непроверенных областей.