Подтвердить что ты не робот

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.

4b9b3361

Ответ 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

Убедитесь, что у вас нет непроверенных областей.