2013-06-12 1 views
4

GamesClient을 사용하여 Google Play 게임 서비스의 리더 보드를 사용하려고합니다. 지금은 importbutton을 클릭하면 GamesClient이 약간의 점수를 제출하는 데 사용됩니다. 아래에서 볼 수 있듯이 오류가 발생합니다. connect() and wait for onConnectd() to be called.게임 클라이언트가 연결되지 않습니다. 오류 : "connect()를 호출하고 onConnected()가 호출되기를 기다립니다."

무엇이 잘못 되었나요? 어떤 자습서에서는 PlusClient이라는 것을 볼 수 있습니다. 나는 그것을 어떤 방식으로 필요로 하는가? 필요한 경우 더 많은 코드를 제공 할 수 있습니다.

이 새로운 Google Play 게임 서비스에 대한 많은 질문이 StackOverflow에 있지만 거기에는 많은 답변이없는 것으로 보입니다. 사람들이 아직도 배우고있는 것처럼 보입니다 - 나와 같이. :)

로그 캣

06-12 00:40:40.173: E/AndroidRuntime(1685): java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called. 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at com.google.android.gms.internal.p.n(Unknown Source) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at com.google.android.gms.internal.p.o(Unknown Source) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at com.google.android.gms.internal.bj.a(Unknown Source) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at com.google.android.gms.games.GamesClient.submitScore(Unknown Source) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at matt.lyons.bibletrivia.lite.MainMenu$8.onClick(MainMenu.java:173) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at android.view.View.performClick(View.java:4204) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at android.view.View$PerformClick.run(View.java:17355) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at android.os.Handler.handleCallback(Handler.java:725) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at android.os.Looper.loop(Looper.java:137) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-12 00:40:40.173: E/AndroidRuntime(1685):  at dalvik.system.NativeStart.main(Native Method) 

MainMenu.java

public class MainMenu extends BaseGameActivity { 

    DatabaseHelper dh; 
    GamesClient client; 
    Context c; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mainmenu); 

     client = getGamesClient(); 
     client.connect(); 

     c = this; 

     dh = new DatabaseHelper(this); 
     dh.openDB(); 

     importbutton = (Button)findViewById(R.id.importbutton); 

     importbutton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       importScores(); 
      } 
     }); 
    } 

    public void importScores() { 

     final Dialog dialog = new Dialog(c); 
     dialog.setContentView(R.layout.importlayout); 
     dialog.setTitle(R.string.importtitle); 

     TextView question = (TextView)dialog.findViewById(R.id.question);  
     Button save = (Button)dialog.findViewById(R.id.save); 
     Button scratch = (Button)dialog.findViewById(R.id.scratch); 

     question.setText(c.getResources().getString(R.string.importquestion)); 
     save.setText(c.getResources().getString(R.string.savebtn)); 
     scratch.setText(c.getResources().getString(R.string.scratchbtn)); 

     save.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 

       long highestJC = dh.getHighestJC(); 
       client.submitScore(c.getResources().getString(R.string.leaderboardjc), highestJC);   

       long highestTenC = dh.getHighestTenC(); 
       client.submitScore(c.getResources().getString(R.string.leaderboardtenc), highestTenC); 

       long highestExodus = dh.getHighestExodus(); 
       client.submitScore(c.getResources().getString(R.string.leaderboardexodus), highestExodus); 

       long highestGenesis = dh.getHighestGenesis(); 
       client.submitScore(c.getResources().getString(R.string.leaderboardgenesis), highestGenesis); 

       long highestHolydays = dh.getHighestHolydays(); 
       client.submitScore(c.getResources().getString(R.string.leaderboardholydays), highestHolydays); 

       long highestFacts = dh.getHighestFacts(); 
       client.submitScore(c.getResources().getString(R.string.leaderboardfacts), highestFacts); 

       long highestActs = dh.getHighestActs(); 
       client.submitScore(c.getResources().getString(R.string.leaderboardacts), highestActs); 

       long highestRandom = dh.getHighestRandom(); 
       client.submitScore(c.getResources().getString(R.string.leaderboardrandom), highestRandom); 

       long highestAll = dh.getHighestAll(); 
       client.submitScore(c.getResources().getString(R.string.leaderboardallcats), highestAll); 

       dialog.dismiss(); 
      } 
     }); 

     scratch.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       dh.deleteAll(); 
       for(int i = 0; i < 15; i++) { 
        dh.insert(0, 0, "-"); 
       } 
       dialog.dismiss(); 
       dh.closeDB(); 
      } 
     }); 

     dialog.show(); 
    } 
} 

답변

3

당신은 연결이 설정되기 전에 점수를 제출하려고합니다.

오류와 마찬가지로 onConnected()를 기다려야 점수 수집을 허용해야합니다. 예 :

int isGooglePlayServiceAvilable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()); 
if (isGooglePlayServiceAvilable == ConnectionResult.SUCCESS) { 
    beginUserInitiatedSignIn(); 
} else { 
    GooglePlayServicesUtil.getErrorDialog(isGooglePlayServiceAvilable, MainMenu.this, REQUEST_DIALOG).show(); 
} 

을 그리고, 이러한 방법 오버라이드 (override) :

@Override 
public void onSignInSucceeded() { 
    super.onSignInSucceeded(); 
    // allow to submit scores 
} 

@Override 
public void onSignInFailed() { 
    super.onSignInFailed(); 
    // do not allow to submit scores 
} 
을 당신이 BaseGameActivity을 확장하는 경우, 이런 식으로 뭔가를해야

를 연결 한 후에는 버튼을 표시해야합니다
4

BaseGameActivity을 사용하는 경우 GamesClient.connect()으로 전화하지 마십시오. BaseGameActivity을 사용하면 모든 상용구를 처리 할 수 ​​있다는 장점이 있습니다. 당신이해야 할 일은 onSignInSucceeded을 오버라이드하고 API 호출을하는 것입니다. onSignInSucceeded을 얻기 전에 게임 API 호출을하지 마십시오.

또한 활동이 onStop이되면 게임 API의 연결이 끊어집니다. 그런 다음 이후에 onStart이 표시되면 API 호출을하기 전에 onSignInSucceeded을 다시 기다려야합니다.

관련 문제