Внедрение игровых сервисов Google Play — как разрешить вход пользователю

Я впервые работаю с API Google, так как я новичок в программировании для Android. Я пытался внедрить игровые сервисы Google Play и отображать списки лидеров в своем приложении (это игра, как вы могли догадаться), и у меня возникли некоторые трудности с документацией Google.

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

  Button bLeaderboard;

  private GoogleApiClient mGoogleApiClient;

  private static int RC_SIGN_IN = 9001;

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


@Override
@SuppressLint("NewApi")
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    bLeaderboard = (Button) findViewById(R.id.bLeaderboard);
    bLeaderboard.setOnClickListener(this);

     mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Games.API).addScope(Games.SCOPE_GAMES)
            .build();
}

@Override
public void onClick(View v) {
    switch (v.getId()) {

        case R.id.bLeaderboard:

            mSignInClicked = true;
            mGoogleApiClient.connect();
}

}

Проблема в том, что всякий раз, когда я нажимаю на кнопку списка лидеров, приложение вылетает, и я получаю это сообщение об ошибке:

AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.example.game, PID: 26284 java.lang.IllegalStateException: произошла фатальная ошибка разработчика. Проверьте журналы для получения дополнительной информации. на com.google.android.gms.common.internal.zzd$zza.zzc(неизвестный источник) на com.google.android.gms.common.internal.zzd$zza.zzv(неизвестный источник) на com.google.android .gms.common.internal.zzd$zze.zzasf(неизвестный источник) на com.google.android.gms.common.internal.zzd$zzd.handleMessage(неизвестный источник) на android.os.Handler.dispatchMessage(Handler.java :102) в android.os.Looper.loop(Looper.java:148) в android.app.ActivityThread.main(ActivityThread.java:5417) в java.lang.reflect.Method.invoke(собственный метод) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) в com.android.internal.os.ZygoteInit.main(ZygoteInit. ява: 616)

Я также не смог понять, что делать с этими тремя реализованными методами:

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

@Override
public void onConnectionSuspended(int i) {
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

Любая помощь очень ценится, так как я не смог найти никаких руководств по этому вопросу, кроме документации Google, которую, как я уже говорил ранее, мне трудно понять и следовать.


person hb22    schedule 14.08.2016    source источник


Ответы (1)


Это работает для меня правильно

 public class MainActivity extends ActionBarActivity implements  GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

// Client used to interact with Google APIs
private GoogleApiClient mGoogleApiClient;
private static int RC_SIGN_IN = 9001;

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



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Games.API).addScope(Games.SCOPE_GAMES)
            .build();
    gameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES);
    gameHelper.enableDebugLog(true);
    gameHelper.setup(new GameHelper.GameHelperListener() {
        @Override
        public void onSignInFailed() {
        Toast.makeText(getApplicationContext(),"Please Check Your Internet Connection!",Toast.LENGTH_LONG).show();
        }

        @Override
        public void onSignInSucceeded() {
            Toast.makeText(getApplicationContext(),"Signed in Succeed",Toast.LENGTH_LONG).show();
        }
    });



    setContentView(view);

    //for load all Score card



    scorecard=(Button)findViewById(R.id.score_card);
    scorecard.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            startActivityForResult(Games.Leaderboards.getAllLeaderboardsIntent(mGoogleApiClient), 1);

        }
    });





}
private boolean isScoreResultValid(final Leaderboards.LoadPlayerScoreResult scoreResult) {
    return scoreResult != null && GamesStatusCodes.STATUS_OK == scoreResult.getStatus().getStatusCode() && scoreResult.getScore() != null;
}



@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

@Override
protected void onStop() {
    super.onStop();
    mGoogleApiClient.disconnect();
}

@Override
public void onConnected(Bundle connectionHint) {
    // The player is signed in. Hide the sign-in button and allow the
    // player to proceed.
    // now submit your high_score
    Games.Leaderboards.submitScore(mGoogleApiClient,getResources().getString(R.string.leaderboard_easy),high_score);

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    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,
                mGoogleApiClient, connectionResult,
                RC_SIGN_IN, "Sign in error")) {
            mResolvingConnectionFailure = false;
        }*/
    }

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

@Override
public void onConnectionSuspended(int i) {
    // Attempt to reconnect
    mGoogleApiClient.connect();
}



protected void onActivityResult(int requestCode, int resultCode,
                                Intent intent) {
    if (requestCode == RC_SIGN_IN) {
        mSignInClicked = false;
        mResolvingConnectionFailure = false;
        if (resultCode == RESULT_OK) {
            mGoogleApiClient.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.signin_failure);
        }
    }
}
// Call when the sign-in button is clicked
private void signInClicked() {
    mSignInClicked = true;
    mGoogleApiClient.connect();
}

// Call when the sign-out button is clicked
private void signOutclicked() {
    mSignInClicked = false;
    Games.signOut(mGoogleApiClient);
}

 }
person NIKHIL SONI    schedule 14.08.2016
comment
Не забудьте также объявить идентификатор электронной почты тестера в консоли игрового сервиса Google Play. - person NIKHIL SONI; 14.08.2016