2014-06-29 12 views
8

ho programmato un gioco per Android, tutto funziona correttamente, ma ora voglio che la mia app abbia Google giochi Servizi di giochi (classifiche e achivments). Ho usato il codice di esempio di Google di accedere ai servizi Google (nessun errore nello script), ma ogni volta che voglio per connettersi con la mia app in debug di maode, ottengo questo errore:Android: errore di connessione dei servizi di gioco di Google (java.lang.IllegalStateException: GoogleApiClient deve essere connesso.)

6-29 11:48:29.391 23779-23779/com.JFKGames.theepicbutton E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.JFKGames.theepicbutton, PID: 23779 
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=9001, result=10004, data=null} to activity {com.JFKGames.theepicbutton/com.JFKGames.theepicbutton.MainActivity}: java.lang.IllegalStateException: GoogleApiClient must be connected. 
      at android.app.ActivityThread.deliverResults(ActivityThread.java:3446) 
      at android.app.ActivityThread.handleSendResult(ActivityThread.java:3489) 
      at android.app.ActivityThread.access$1300(ActivityThread.java:139) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5102) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.IllegalStateException: GoogleApiClient must be connected. 
      at com.google.android.gms.internal.fq.a(Unknown Source) 
      at com.google.android.gms.games.Games.c(Unknown Source) 
      at com.google.android.gms.games.internal.api.LeaderboardsImpl.submitScore(Unknown Source) 
      at com.google.android.gms.games.internal.api.LeaderboardsImpl.submitScore(Unknown Source) 
      at com.JFKGames.theepicbutton.MainActivity.onActivityResult(MainActivity.java:79) 
      at android.app.Activity.dispatchActivityResult(Activity.java:5446) 
      at android.app.ActivityThread.deliverResults(ActivityThread.java:3442) 
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3489) 
            at android.app.ActivityThread.access$1300(ActivityThread.java:139) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:136) 
            at android.app.ActivityThread.main(ActivityThread.java:5102) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
            at dalvik.system.NativeStart.main(Native Method) 

E l'applicazione si blocca . Ecco il mio codice per il MainActivity dove voglio per connettersi:

public class MainActivity extends BaseGameActivity implements 



GameHelper.GameHelperListener, View.OnClickListener { 

    public static int REQUEST_LEADERBOARD = 1002; 
    boolean mExplicitSignOut = false; 
    boolean mInSignInFlow = false; 

    GoogleApiClient mClient() { 

     return null; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     setRequestedClients(BaseGameActivity.CLIENT_GAMES | BaseGameActivity.CLIENT_APPSTATE); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button button = (Button)findViewById(R.id.startbutton); 
     button.setOnClickListener (this); 
     Button highscorebutton = (Button)findViewById(R.id.highscorebutton); 
     highscorebutton.setOnClickListener(this); 
     findViewById(R.id.sign_in_button).setOnClickListener(this); 
     findViewById(R.id.sign_out_button).setOnClickListener(this); 

    } 


    public void onClick(View view) { 
     if(view.getId()==R.id.startbutton) { 
      startActivityForResult(new Intent(this, buttonActivity.class), 1); 
     } else if(view.getId()==R.id.highscorebutton) { 
      startActivityForResult(Games.Leaderboards.getLeaderboardIntent(getApiClient(), getString(R.string.the_best_players)),REQUEST_LEADERBOARD); 
     } else if (view.getId() == R.id.sign_in_button) { 
      // start the asynchronous sign in flow 
      beginUserInitiatedSignIn(); 

     } 
     else if (view.getId() == R.id.sign_out_button) { 
      // sign out. 
      signOut(); 

      // show sign-in button, hide the sign-out button 
      findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); 
      findViewById(R.id.sign_out_button).setVisibility(View.GONE); 
     } 


    } 


    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Games.Leaderboards.submitScore(getApiClient(), getString(R.string.the_best_players), resultCode); 
     if(requestCode==1) { 
      if(resultCode > leseHighscore()) { 
       schreibeHighscore(resultCode); 
      } 
     } 
    } 

    @Override 
    public void onSignInFailed() { 

     findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); 
     findViewById(R.id.sign_out_button).setVisibility(View.GONE); 


    } 

    @Override 
    public void onSignInSucceeded() { 



      View a = findViewById(R.id.highscorebutton); 
      a.setVisibility(View.VISIBLE); 

      View b = findViewById(R.id.button3); 
      b.setVisibility(View.VISIBLE); 

      findViewById(R.id.sign_in_button).setVisibility(View.GONE); 
      findViewById(R.id.sign_out_button).setVisibility(View.VISIBLE); 




    } 

} 

Grazie, GoogleWelt

risposta

3

Secondo il official documentation, "Prima di ogni operazione viene eseguita, il GoogleApiClient deve essere collegato"

Quando l'utente non connesso (effettuato l'accesso) e clicca per mostrare classifiche o risultati, comporta l'eccezione generata. Modificare il codice per l'avvio della classifica in questo modo:

} else if(view.getId()==R.id.highscorebutton) { 
    if (isSignedIn()) 
    startActivityForResult(Games.Leaderboards.getLeaderboardIntent(getApiClient(), getString(R.string.the_best_players)), REQUEST_LEADERBOARD); 
    else showAlert("Please sign in to view leaderboards"); 

} 

Utilizzare la stessa logica per mostrare i risultati:

if (isSignedIn()) 
startActivityForResult(Games.Achievements.getAchievementsIntent(getApiClient()), REQUEST_ACHIEVEMENT); 
else showAlert("Please sign in to view achievements"); 
0

Controllare la parte in cui si stanno ottenendo ApiClient cioè getApiClient(). Scrivi il codice qui sotto per vedere se GoogleApiClient è connesso o meno.

GoogleApiClient mGoogleApiClient; 
    if(mGoogleApiClient.isConnected()){ 
    // good 
    }else{ 
    //connect it 
    mGoogleApiClient.connect(GoogleApiClient.SIGN_IN_MODE_OPTIONAL); 
    } 
Problemi correlati