我正在尝试使用GamesClient
来使用Google Play游戏服务的排行榜。现在我已经拥有它,所以当点击importbutton
时,GamesClient
用于提交一些分数。如下所示,我收到错误connect() and wait for onConnectd() to be called.
我做错了什么?我在一些教程中看到了一个名为PlusClient
的东西。我是否需要某种方式?如果需要,我可以提供更多代码。
看来StackOverflow上有很多关于这个新的Google Play游戏服务的问题,但那里没有很多答案。看起来人们还在学习 - 就像我一样。 :)
logcat的
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();
}
}
答案 0 :(得分:4)
如果您使用BaseGameActivity
,请不要致电GamesClient.connect()
。使用BaseGameActivity
的优点是它可以为您处理所有连接样板。您所要做的就是覆盖onSignInSucceeded
并从那里进行API调用。在获得onSignInSucceeded
之前,请不要进行任何游戏API调用。
此外,请记住,当您的活动获得onStop
时,游戏API将会断开连接。之后,当它随后获得onStart
时,您会在进行任何API调用之前再次等待onSignInSucceeded
。
答案 1 :(得分:3)
您正在尝试在建立连接之前提交分数。
如错误所示,您应该等待onConnected(),然后才应该允许提交分数。示例:您应该只在连接后显示按钮
如果要扩展BaseGameActivity,则应该执行以下操作:
int isGooglePlayServiceAvilable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
if (isGooglePlayServiceAvilable == ConnectionResult.SUCCESS) {
beginUserInitiatedSignIn();
} else {
GooglePlayServicesUtil.getErrorDialog(isGooglePlayServiceAvilable, MainMenu.this, REQUEST_DIALOG).show();
}
然后,你应该覆盖这些方法:
@Override
public void onSignInSucceeded() {
super.onSignInSucceeded();
// allow to submit scores
}
@Override
public void onSignInFailed() {
super.onSignInFailed();
// do not allow to submit scores
}