【问题标题】:GamesClient not connecting. Error: "Call connect() and wait for onConnected() to be called."GamesClient 未连接。错误:“调用 connect() 并等待调用 onConnected()。”
【发布时间】:2013-06-12 00:50:37
【问题描述】:

我正在尝试使用 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();
    }
}

【问题讨论】:

    标签: java android google-play-services


    【解决方案1】:

    如果您使用的是BaseGameActivity,请不要拨打GamesClient.connect()。使用BaseGameActivity 的优点是它可以为您处理所有连接样板。您所要做的就是覆盖 onSignInSucceeded 并从那里进行 API 调用。在获得onSignInSucceeded 之前不要进行任何游戏 API 调用。

    另外,请记住,当您的活动收到 onStop 时,游戏 API 将断开连接。之后,当它随后获得onStart 时,您将再次等待onSignInSucceeded,然后再进行任何 API 调用。

    【讨论】:

      【解决方案2】:

      您正在尝试在建立连接之前提交分数。

      就像错误所说的那样,您应该等待 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
      }
      

      【讨论】:

        猜你喜欢
        • 2016-05-19
        • 2014-04-13
        • 2023-03-09
        • 2013-12-14
        • 2014-05-26
        • 2019-07-07
        • 2013-10-08
        • 1970-01-01
        • 2016-06-06
        相关资源
        最近更新 更多