2017-08-24 11 views
2

Googleアカウントでログインするための有効なアプリケーションがあります。GoogleApiClient:Games.APIとAuth.GOOGLE_SIGN_IN_APIが連携していません

この

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) 
     .requestEmail() 
     .requestProfile() 
     .requestIdToken(getString(R.string.server_client_id)) 
     .build(); 

GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .addConnectionCallbacks(this) 
       .build(); 

は今、私は次のクライアントに結果Games.APIを追加することを決めたように、私は私のクライアントを構築しています:

GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) 
     .addApi(Games.API) 
     .addScope(Games.SCOPE_GAMES) 
     .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
     .addConnectionCallbacks(this) 
     .build(); 

しかし、私はクライアントに

を接続しようとすると、
googleApiClient.connect(); 

次の例外があります。

java.lang.IllegalStateException: Cannot use SIGN_IN_MODE_REQUIRED with GOOGLE_SIGN_IN_API. Use connect(SIGN_IN_MODE_OPTIONAL) instead. 

だから私は例外を読んで、だから今、私はこれ以上の例外を得ることはありませんが、クライアントが何らかの理由で接続されることは決してありません

googleApiClient.connect(GoogleApiClient.SIGN_IN_MODE_OPTIONAL); 

に私の接続コールを修正。クライアントが今接続しない理由は何ですか?

EDIT:完全な作業コード例

package at.hakkon.space.signin; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.widget.Toast; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.games.Games; 
import com.google.example.games.basegameutils.BaseGameUtils; 

import at.hakkon.space.R; 
import at.hakkon.space.activity.MainActivity; 
import at.hakkon.space.application.ApplicationClass; 



public class GoogleSignInActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks { 

    private static final String TAG = "T1_GSignInActivity"; 

    private static int RC_SIGN_IN = 9001; 

    private boolean mResolvingConnectionFailure = false; 
    private boolean mAutoStartSignInflow = true; 
    private boolean mSignInClicked = false; 

    private static GoogleApiClient googleApiClient; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(TAG, "GoogleSignInActivity"); 

     setupGoogleClient(); 
    } 



    public void setupGoogleClient() { 
     googleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(Games.API).addScope(Games.SCOPE_GAMES) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

     ApplicationClass.getInstance().setGoogleClient(googleApiClient); 
    } 


    @Override 
    public void onStart() { 
     super.onStart(); 
     googleApiClient.connect(); 
    } 


    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == RC_SIGN_IN) { 
      mSignInClicked = false; 
      mResolvingConnectionFailure = false; 
      if (resultCode == RESULT_OK) { 
       googleApiClient.connect(); 
      } else { 
       // Bring up an error dialog to alert the user that sign-in 
       // failed. The R.string.signin_failure should reference an error 
       // string in your strings.xml file that tells the user they 
       // could not be signed in, such as "Unable to sign in." 
       BaseGameUtils.showActivityResultError(this, 
         requestCode, resultCode, R.string.sign_in_other_error); 
      } 
     } 
    } 

    private void startNextActivity() { 
     finish(); 
     Intent intent = new Intent(this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } 


    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     Toast.makeText(this, "Google Client Connection failed:\n" + connectionResult.toString(), Toast.LENGTH_LONG).show(); 

     if (mResolvingConnectionFailure) { 
      // already resolving 
      return; 
     } 

     // if the sign-in button was clicked or if auto sign-in is enabled, 
     // launch the sign-in flow 
     if (mSignInClicked || mAutoStartSignInflow) { 
      mAutoStartSignInflow = false; 
      mSignInClicked = false; 
      mResolvingConnectionFailure = true; 

      // Attempt to resolve the connection failure using BaseGameUtils. 
      // The R.string.signin_other_error value should reference a generic 
      // error string in your strings.xml file, such as "There was 
      // an issue with sign-in, please try again later." 

      if (!BaseGameUtils.resolveConnectionFailure(this, googleApiClient, connectionResult, RC_SIGN_IN, R.string.sign_in_other_error)) { 
       mResolvingConnectionFailure = false; 
       Toast.makeText(this, "Conflict NOT RESOLVED :((", Toast.LENGTH_LONG).show(); 
      }else{ 
       Toast.makeText(this, "Conflict RESOLVED", Toast.LENGTH_LONG).show(); 
       //startNextActivity(); 
      } 

     } 

     // Put code here to display the sign-in button 

     //Log.d(TAG, "onConnectionFailed:" + connectionResult); 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     Toast.makeText(this, "Google Client Connected.", Toast.LENGTH_LONG).show(); 
     startNextActivity(); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     Toast.makeText(this, "Google Client Connection Suspended.", Toast.LENGTH_LONG).show(); 
    } 
} 

答えて

1

使用

mGoogleApiClient = new GoogleApiClient.Builder(activity) 
      .addApi(Games.API) 
      .addConnectionCallbacks(callbacks) 
      .build(); 

、あなたが正しくコンソールにゲームを構成した場合、その後

mGoogleApiClient.connect(); 

- それは、接続して取得しますゲームの機能へのアクセス(成果とリーダーボードfまたは例)

class GoogleConnectionCallbacks implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks { 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     MyLogger.d("DBG_GGL_LDB", "connected"); 
     Player p = Games.Players.getCurrentPlayer(mGoogleApiClient); 
     String displayName; 
     if (p == null) { 
      Log.w("DBG_GGL_LDB", "mGamesClient.getCurrentPlayer() is NULL!"); 
      displayName = "???"; 
     } else { 
      displayName = p.getDisplayName(); 
     } 
     MyLogger.d("DBG_GGL_LDB", "Hello, " + displayName); 

     if (mGoogleApiClient.hasConnectedApi(Games.API)) { 

      MyLogger.d("DBG_GGL_LDB", "hasConnectedApi true - can user leaderboard"); 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     MyLogger.d("DBG_GGL_LDB", "connection suspended"); 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     MyLogger.d("DBG_GGL_LDB", "connection failed " + connectionResult.getErrorMessage()); 

    } 
} 

私はかなり長い間、この問題に直面してきた、それはコードが私のテストデバイス以外のデバイス上で完璧にうまく働いたすべてのために使用.addApi(Auth.GOOGLE_SIGN_IN_API, gso)

+0

こんにちは。あなたの応答をありがとうが、実際に投稿されたコードは完全に正常に動作します。私は自分のテストデバイスに集中していたので、他のデバイスはテストしませんでした。他のデバイスが動作していることを確認し、テスト用のデバイスでGoogle Playを再インストールした後も動作しました。 – Markus

0

のです。テスト用端末にGoogle Playを再インストールした後も機能しました。私は何が問題を引き起こしたのか分かっていませんが、再インストールはそれを修正しました。

私はSIGN_INをまったく必要としません。あなたがそれを必要とすればアレクサンドルズの答えを見てください!

+1

あなたはSIGN_IN APIを削除しました。それが再起動のためではなく、私が思ったように動作するようになったのです。 –

+0

あなたは正しいです.2ヶ月経っていますので詳細は不明です。私はSignInがもう必要ないと分かった。それでも私はそれを動作させるために何らかの理由でGoogle Playを再インストールする必要がありました。 – Markus

関連する問題