2014-06-29 21 views
8

Tôi đã lập trình một trò chơi cho android, mọi thứ hoạt động tốt, nhưng giờ tôi muốn ứng dụng của mình có các dịch vụ trò chơi của Google Play (leaderboards và achivments). Tôi đã sử dụng mã ví dụ Google để đăng nhập vào các dịch vụ của Google (không có lỗi trong kịch bản), nhưng mỗi lần tôi muốn kết nối với App của tôi trong debug maode, tôi nhận được lỗi này:Android: Lỗi kết nối dịch vụ trò chơi Google Play (java.lang.IllegalStateException: GoogleApiClient phải được kết nối.)

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) 

Và tai nạn App . Dưới đây là mã của tôi cho MainActivity nơi mà tôi muốn nó kết nối:

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); 




    } 

} 

Cảm ơn, GoogleWelt

Trả lời

3

Theo official documentation, "Trước khi bất kỳ hoạt động được thực thi, các GoogleApiClient phải được kết nối"

Khi người dùng không được kết nối (đã đăng nhập) và nhấp chuột để hiển thị bảng xếp hạng hoặc thành tích, điều đó dẫn đến ngoại lệ được ném. Sửa đổi mã của bạn cho ra mắt bảng dẫn như thế này:

} 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"); 

} 

Sử dụng cùng một logic cho những thành tựu cho thấy:

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

Kiểm tra phần mà bạn đang nhận được ApiClient ví dụ getApiClient(). Viết mã bên dưới để xem liệu GoogleApiClient có được kết nối hay không.

GoogleApiClient mGoogleApiClient; 
    if(mGoogleApiClient.isConnected()){ 
    // good 
    }else{ 
    //connect it 
    mGoogleApiClient.connect(GoogleApiClient.SIGN_IN_MODE_OPTIONAL); 
    } 
Các vấn đề liên quan