2017-02-21 26 views
0

Я сделал учетную запись, используя firebase для подключения к Google. Пользователь может войти в систему без проблем Теперь я хочу показать лидеров на другой вид деятельности, однако, когда я проверяю, если пользователь вошел в систему, и я стараюсь, чтобы показать лидеров я получаю ошибку:Android FireBase - подключение к игровому серверу Leaderboard

E/UncaughtException: java.lang.IllegalStateException: GoogleApiClient must be connected.

Как я могу подключиться GoogleApiClient с использованием firebase? Я пробовал использовать mGoogleApiClient.connect(GoogleApiClient.SIGN_IN_MODE_OPTIONAL);, но это также не работает.

вот мой код:

 protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_achievements); 


       // Configure Google Sign In 
       GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
         .requestIdToken(getString(R.string.default_web_client_id)) 
         .requestEmail() 
         .build(); 

       mGoogleApiClient = new GoogleApiClient.Builder(this) 
         .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() { 
          @Override 
          public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
           // connection failed, should be handled 
          } 
         }) 
         .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
         .build(); 

       mAuth = FirebaseAuth.getInstance(); 

       mAuthListener = new FirebaseAuth.AuthStateListener() { 
        @Override 
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
         FirebaseUser user = firebaseAuth.getCurrentUser(); 
         if (user != null) { 
          // User is signed in 
          Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 

    ////// is crashing googleapiclient not connected 

startActivityForResult(Games.Leaderboards.getLeaderboardIntent(mGoogleApiClient, 
            getString(R.string.leaderboard_la_classifica)), REQUEST_LEADERBOARD); 

         } else { 
          // User is signed out 
         } 
         // ... 
        } 
       }; 

      } 

ответ

0

См https://firebase.google.com/docs/auth/android/google-signin для более подробной информации.

При создании клиента вам необходимо использовать GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_firebase_games_signin); 

    String webclientId = getString(R.string.web_client_id); 

    GoogleSignInOptions options = 
      new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) 
        .requestServerAuthCode(webclientId) 
        .requestEmail() 
        .requestIdToken() 
        .build(); 

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

} 

Затем, чтобы начать явный вход начать Намерение зарегистрировались:

private void signIn() { 
    Intent signInIntent = 
     Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
} 

Вы также должны использовать automanaged клиента, или просто позвоните mGoogleApiClient.connect(GoogleApiClient.SIGN_IN_MODE_OPTIONAL); в onStart() и разъединить в onStop().

В onActivityResult, обрабатывать результат явного входа в намерении:

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

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
    if (requestCode == RC_SIGN_IN) { 
     GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
     if (result.isSuccess()) { 
      // Google Sign In was successful, authenticate with Firebase 
      GoogleSignInAccount acct = result.getSignInAccount(); 

      completeFirebaseAuth(acct); 

      // At this point, the Games API can be called. 

     } else { 
      // Google Sign In failed, update UI appropriately 
      // ... 
     } 
    } 
} 

Завершения Firebase аутентификации:

private void completeFirebaseAuth(GoogleSignInAccount acct) { 
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
    FirebaseAuth mAuth = FirebaseAuth.getInstance(); 
    mAuth.signInWithCredential(credential) 
      .addOnCompleteListener(this, new 
        OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); 

        // If sign in fails, display a message to the user. If sign in succeeds 
        // the auth state listener will be notified and logic to handle the 
        // signed in user can be handled in the listener. 
        if (!task.isSuccessful()) { 
         Log.w(TAG, "signInWithCredential", task.getException()); 
        } 
        // ... 
       } 
      }); 
} 

Другая ситуация, вы должны обращаться с молчаливым входом , которое происходит при возобновлении приложения:

@Override 
public void onConnected(@Nullable Bundle bundle) { 

    // Handle the silent sign-in case. 

    if (mGoogleApiClient.hasConnectedApi(Games.API)) { 
     Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient).setResultCallback(
       new ResultCallback<GoogleSignInResult>() { 
        @Override 
        public void onResult(
          @NonNull GoogleSignInResult googleSignInResult) { 
         if (googleSignInResult.isSuccess()) { 
          completePlayGamesAuth(
            googleSignInResult.getSignInAccount()); 
         } else { 
          Log.e(TAG, "Error with silentSignIn: " + 
            googleSignInResult.getStatus()); 
         } 
        } 
       } 
     ); 
    } 
}