1
\$\begingroup\$

Im looking for some help on implementing Google Play sign in. Ive got the interface part figured out, but the last time I did this, google had a gamehelper utility and now it doesnt and having trouble figuring out how to implement the sign in, so after they sign in the first time it auto signs in when the app starts. Also cant seem to think of how ot send the info back to update the display with their new info...Heres what I got:

Main Game uses an interface and calls the sign in function on button click:

TextButton profile = new TextButton("Login",skin, "default");
        profile.addListener(new ClickListener(){
            @Override
            public void clicked(InputEvent event, float x, float y) {
                game.playServices.signIn();
            }
        });

Then taking the code from one of the examples from the google source this is my android launcher:

//Client used to sign in with Google APIs
   private GoogleSignInClient mGoogleSignInClient;

   //request codes we use when invoking an external activity
   private static final int RC_SIGN_IN = 9001;

   //Client variables
   private PlayersClient mPlayersClient;

@Override
   protected void onResume() {
      super.onResume();
      Log.d(TAG, "onResume()");

      // Since the state of the signed in user can change when the activity is not active
      // it is recommended to try and sign in silently from when the app resumes.
      signInSilently();
   }



   @Override
   public void signIn() {
      startSignInIntent();
   }

   @Override
   public void signOut() {
      Log.d(TAG, "signOut()");

      if (!isSignedIn()) {
         Log.w(TAG, "signOut() called, but was not signed in!");
         return;
      }

      mGoogleSignInClient.signOut().addOnCompleteListener(this,
            new OnCompleteListener<Void>() {
               @Override
               public void onComplete(@NonNull Task<Void> task) {
                  boolean successful = task.isSuccessful();
                  Log.d(TAG, "signOut(): " + (successful ? "success" : "failed"));

                  onDisconnected();
               }
            });
   }

@Override
   public boolean isSignedIn() {
      return GoogleSignIn.getLastSignedInAccount(this) != null;
   }

private void signInSilently(){
      Log.d(TAG, "signInSilently()");

      mGoogleSignInClient.silentSignIn().addOnCompleteListener(this,
            new OnCompleteListener<GoogleSignInAccount>() {
               @Override
               public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
                  if (task.isSuccessful()) {
                     Log.d(TAG, "signInSilently(): success");

                     onConnected(task.getResult());
                  } else {
                     Log.d(TAG, "signInSilently(): failure", task.getException());
                     onDisconnected();
                  }
               }
            });
   }

   private void startSignInIntent() {
      startActivityForResult(mGoogleSignInClient.getSignInIntent(), RC_SIGN_IN);
   }

   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      if (requestCode == RC_SIGN_IN) {
         Task<GoogleSignInAccount> task =
               GoogleSignIn.getSignedInAccountFromIntent(data);

         try {
            GoogleSignInAccount account = task.getResult(ApiException.class);
            onConnected(account);
         } catch (ApiException apiException) {
            String message = apiException.getMessage();
            if (message == null || message.isEmpty()) {
               message = getString(R.string.signin_other_error);
            }

            onDisconnected();

            new AlertDialog.Builder(this)
                  .setMessage(message)
                  .setNeutralButton(android.R.string.ok, null)
                  .show();
         }
      }
   }

   private void onDisconnected() {
      Log.d(TAG, "onDisconnected()");

      mPlayersClient = null;
      // Show sign-in button on main menu

   }

   private void onConnected(GoogleSignInAccount googleSignInAccount) {
      Log.d(TAG, "onConnected(): connected to Google APIs");

      GamesClient gamesClient = Games.getGamesClient(AndroidLauncher.this, googleSignInAccount);
      gamesClient.setGravityForPopups(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
      gamesClient.setViewForPopups(((AndroidGraphics) Gdx.graphics).getView());

      mPlayersClient = Games.getPlayersClient(this, googleSignInAccount);

      // Show sign-out button on main menu

      // Set the greeting appropriately on main menu
      mPlayersClient.getCurrentPlayer()
            .addOnCompleteListener(new OnCompleteListener<Player>() {
               @Override
               public void onComplete(@NonNull Task<Player> task) {
                  String displayName;
                  if (task.isSuccessful()) {
                     displayName = task.getResult().getDisplayName();
                  } else {
                     Exception e = task.getException();
                     handleException(e, getString(R.string.players_exception));
                     displayName = "???";
                  }
                  //mMainMenuFragment.setGreeting("Hello, " + displayName);
               }
            });


      // if we have accomplishments to push, push them
      //if (!mOutbox.isEmpty()) {
      //   pushAccomplishments();
      //   Toast.makeText(this, getString(R.string.your_progress_will_be_uploaded),
      //         Toast.LENGTH_LONG).show();
      //}

      //loadAndPrintEvents();

   }

   private void handleException(Exception e, String details) {
      int status = 0;

      if (e instanceof ApiException) {
         ApiException apiException = (ApiException) e;
         status = apiException.getStatusCode();
      }

      String message = getString(R.string.status_exception_error, details, status, e);

      new AlertDialog.Builder(AndroidLauncher.this)
            .setMessage(message)
            .setNeutralButton(android.R.string.ok, null)
            .show();
   }

I think it logs in as I get the log output of success

D/RoboSmash: signInSilently(): success D/RoboSmash: onConnected(): connected to Google APIs

But it just flashes like it is going to another activity real quick and then comes back. Doesnt show the login or the little alert at the top like other games

\$\endgroup\$
0
\$\begingroup\$

After the player successfully logs in, you can use the account to get the Games client and then set the view the popups appear on.

gamesClient = Games.getGamesClient(this, signedInAccount);
gamesClient.setViewForPopups(findViewById(android.R.id.content));
gamesClient.setGravityForPopups(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.