web-dev-qa-db-ja.com

SIGN_IN_REQUIRED(4)を与えるonConnectionFailed

Google APIを使用するAndroidアプリケーションを開発しています。そのために、google-play-service-libプロジェクト。

私はこれに従っています link 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)私のアクティビティはConnectionCallbacksOnConnectionFailedListener。を実装します

4)onConnectionFailed()メソッドは次のようになります。

_public void onConnectionFailed(ConnectionResult result) {
    //in dubug result looks like : ConnectionResult{
    //statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent
                    // {41f8ca70: Android.os.BinderProxy@41f8ca10}}
     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

グーグルの instructionss に従うだけ

AND[〜#〜] caution [〜#〜]

まだ開発モードになっているので、ゲームを公開する前に、テストメールアドレスをGAME DETAILSセンターに追加したかどうかを確認してください。

8
Naskov

Google Play Developer's Consoleにアップロードされたapkにあるキーストアでアプリに署名していることを確認します(テストする場合は、アルファ版としてアップロードし、非公開のまま公開できます)。

そうでない場合、それは他のものかもしれません。アカウントのメールアドレスがアカウント詳細ページ(歯車アイコンのある設定メニュー)のテスターに​​リストされており、ライセンスされた応答がRESPOND_NORMALLYではなくLICENSEDに設定されていることを確認します。

6
Michael Chinen

これがbestの答えかどうかはわかりませんが、うまくいきました。 BasicSamples TakeANumber MainActivityからonConnectionFailed()をコピーしました。 BaseGameUtilsを呼び出して解決します。もちろん、これは、プロジェクトにBaseGameUtilsライブラリが含まれていることを意味します。これは、ワームの別の缶です。ただし、1つの方法でうまくいくかもしれないので、以下にコピーします。

@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

ドライブ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をサポートし、gradle:appでcompileSDKVersionとtargetSDKVersionを維持します。マニフェストにGoogleドライブ対応API_KEYを追加して、もう一度試してください。

1
Anjali

これと私の経験を共有したいと思います。私の場合は、Google Playゲーム用のGoogle Play Servicesを使用したときでした。また、SIGN_IN_REQUIREDエラーが発生するonConnectionFailedを取得していました。最後に、開発者コンソールでゲーム設定を「公開」していなかったことに気付きました。 apkの「アルファ版」または「ベータ版」の公開と間違われないようにしてください。私が作成し、ゲームのAPKにリンクする実際のGoogle Playゲーム「ゲーム」を意味します。

1
Jonathan

私の場合、問題は追加された繊細なスコープにあり、検証されていません:

https://console.developers.google.com/apis/credentials 資格情報-> OAuth同意画面-> Google APIのスコープ

未検証のスコープがないことを確認してください。

1
Kirill Kuzyk

私の原因のために、開発者コンソールでAPIを生成するためにリリースSHA1キーを誤って使用しました。次に、debug.keystoreでSHA1キーを作成し、API資格情報で更新しました。その作業を開始しました。

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