it-roy-ru.com

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

Когда я запускаю свое приложение, я получаю Toast, в котором говорится, что возникла внутренняя ошибка. Я создал проект в консоли Google.

21
DCoder

У меня такая же проблема.

Из документации: Клиент может продолжить без использования 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;
}
23
user2642219

Просто следуйте Google инструкции

И ОСТОРОЖНО

Поскольку вы все еще находитесь в режиме разработки, проверьте, добавили ли вы свой тестовый адрес электронной почты в центр GAME DETAILS, прежде чем публиковать игру.

7
Naskov

Убедитесь, что вы подписываете приложение с помощью хранилища ключей, которое находится в apk, загруженном в консоль разработчика Google Play (при тестировании вы можете загружать как альфа-версию и публиковать, сохраняя ее конфиденциальность).

Если бы не это, это могли быть другие вещи. Убедитесь, что адрес электронной почты вашей учетной записи указан в списке тестеров на странице сведений об учетной записи (в меню настроек со значком шестеренки), а лицензионный ответ имеет значение LICENSED, а не RESPOND_NORMALLY.

6
Michael Chinen

Не уверен, что это лучший ответ, но это сработало для меня. Я скопировал onConnectionFailed () из базового примера TakeAumber 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;
    }
}
3
user6627139

Drive API должен быть включен со страницы консоли.

3
challenger

Эта ошибка указывает на то, что пользователю необходимо авторизовать ваше приложение. Для этого есть полный рабочий процесс, следуя инструкциям по адресу https://developers.google.com/+/mobile/Android/getting-started ищите «onConnectionFailed»

3
Hounshell

если вы не используете ключи отладки, нажмите приложение в Google Play в качестве альфа-версии, добавьте себя в качестве тестера и САМОЕ главное - перейдите по ссылке «Подписаться» на странице Aplha и ПОДТВЕРДИТЕ, что вы тестер.

2
Max

У меня была та же проблема, и я решил это, У меня действительно была очень старая версия библиотеки google play-services, поэтому я обновил ее до последней библиотеки google play-service до compile 'com.google.Android.gms: play- services: 11.0.4 'из моей предыдущей версии библиотеки для поддержки вашего Android SDK и поддержки compileSDKVersion и targetSDKVersion в gradle: app. добавьте google drive с включенным API_KEY в manifest.and попробуйте снова 

1
Anjali

Я хотел бы поделиться своим опытом с этим. Мой случай был при использовании Google Play Services для игр Google Play. Я также получаю onConnectionFailed с сообщением об ошибке SIGN_IN_REQUIRED. Наконец я понимаю, что я не «опубликовал» свои настройки игры в консоли разработчика. Не путайте с публикацией "альфа" или "бета" версии вашего apk. Я имею в виду саму игру "Игра" в Google Play, которую вы создаете, и ссылаетесь на APK игры.

1
Jonathan

по моей причине я неправильно использовал ключ выпуска SHA1 для генерации API в консоли разработчика .... Затем создал ключ SHA1 с debug.keystore и обновил свои учетные данные API. Его начал работать. 

keytool -list -v -keystore "C:\Users\<user>n\.Android\debug.keystore" -alias androiddebugkey -storepass andro
id -keypass Android
0
Anand saga