3

我想将我的游戏与 google play 服务连接起来。我已阅读有关 android 开发人员的文档并尝试遵循 type-a-number 示例,但仍然无法加载排行榜。

我有导入baseGameUtils,但我使用andengine所以我没有使用谷歌的扩展BaseGameActivity。

到目前为止我所拥有的:
- GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) 返回成功
- startActivityForResult(pickAccountIntent, REQUEST_CODE_PICK_ACCOUNT); 运行良好,我从 onActivityResult(..) 获得了我的帐户名;
- 我已经把这个放在我的清单上。

<meta-data android:name="com.google.android.gms.games.APP_ID"
        android:value="@string/app_id" />

我的问题是
1. 我可以在没有扩展 BaseGameActivity 的情况下使用 google play 服务吗?
2. 如果我使用 gameHelper.beginUserInitiatedSignIn(); 在我得到我的帐户名后,我在 log cat 上得到了这个。(这个连接是什么意思?因为我在下一个问题上仍然有错误)

08-25 00:09:01.890: D/BaseGameActivity(11222): isGooglePlayServicesAvailable returned 0  
08-25 00:09:01.890: D/BaseGameActivity(11222): beginUserInitiatedSignIn: starting new sign-in flow.  
08-25 00:09:01.890: D/BaseGameActivity(11222): All clients now connected. Sign-in successful.  
08-25 00:09:01.890: D/BaseGameActivity(11222): All requested clients connected. Sign-in succeeded!  

3. 我如何使用连接()?我已经阅读并尝试过 gameClient 和 GameClientBuilder 但我不知道如何使用它。当我尝试运行此代码时。

startActivityForResult(gameHelper.getGamesClient().getAllLeaderboardsIntent(), RC_UNUSED);  

我得到了这个日志。

08-25 00:09:05.660: E/AndroidRuntime(11222): java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called.

4. 要使用排行榜,我知道我必须使用来自 google play 商店的代码,例如 CgkIx* ** *AIQAA。但我没有找到我必须把这段代码放在哪里来加载排行榜。

抱歉,问题很长,但我认为如果有一个仅用于连接和访问成就或排行榜的示例,它将回答我所有的问题。请不要告诉我查看 type-a-number 示例,我这样做了,我需要另一个示例代码。

更新,我的代码

public class MainMenu extends Activity 
implements OnClickListener, GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, GameHelperListener{

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main_menu);
  gameHelper = new GameHelper(this);
}

@Override
public void onClick(View v) {
  if(v.equals(loadData)) {
    if(gameHelper.isSignedIn()) {
      gameHelper.setup(this, GameHelper.CLIENT_GAMES, Scopes.GAMES);
      startActivityForResult(gameHelper.getGamesClient().getAllLeaderboardsIntent(), RC_UNUSED);
    }
  }
  else if(v.equals(loginButton)) {
    Intent googlePicker = AccountPicker.newChooseAccountIntent(null,null,new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE},true,null,null,null,null) ;
    startActivityForResult(googlePicker, REQUEST_CODE_PICK_ACCOUNT);
  }
}

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
  if(requestCode==REQUEST_CODE_RECOVER_PLAY_SERVICES) {
    if (resultCode == RESULT_CANCELED) {
      Toast.makeText(this, "Google Play Services must be installed.", Toast.LENGTH_SHORT).show();
      finish();
    }
    return;
  }
  else if(requestCode==REQUEST_CODE_PICK_ACCOUNT) {
    if (resultCode == RESULT_OK) {
      String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
      gameHelper.beginUserInitiatedSignIn();
    }
    else if (resultCode == RESULT_CANCELED) {
      Toast.makeText(this, "This application requires a Google account.", Toast.LENGTH_SHORT).show();
      finish();
    }
    return;
  }
  super.onActivityResult(requestCode, resultCode, data);
}

// this 2 methods not called, is this also because my code is wrong?
@Override
public void onSignInFailed() {
  Log.d("rush", "on sign in failed");
}

@Override
public void onSignInSucceeded() {
  Log.d("rush", "on sign in succeed");
}

}
4

2 回答 2

2
  1. 是的。看看BaseGameActivity源代码,看看它在很大程度上只是 wraps GameHelper。您可以实现对GameHelper自己的调用 - 事实上,您可以直接从BaseGameActivity. 我有点困惑,因为您的代码似乎已经在使用GameHelper. 看起来您正在将GameHelper呼叫与BaseGameActivity呼叫混在一起。你不能这样做,它会导致......像你得到的错误。

  2. 您看到的 LogCat 意味着您的所有客户端都已连接。默认调用GameHelper.setup()仅请求 Games 客户端。如果您不使用BaseGameActivity并且想要不同的客户端,请执行以下操作:

    gameHelper = new GameHelper(this);
    gameHelper.setup(this, GameHelper.CLIENT_GAMES | GameHelper.CLIENT_PLUS);
    
  3. beginUserInitiatedSignIn()是一个异步方法,当它完成时有一个回调。你是这样运行的吗?GameHelper.GameHelperListener是要实现的接口。如果您使用的是 gameHelper,请确保注册回调。this在上面的设置调用中看到了吗?那是注册回调(this是我的主要活动)。

    正如我上面所说,看起来您正在将GameHelper呼叫与BaseGameActivity呼叫混合。连接的GameHelperBaseGameActivity.mHelper实例,而不是GameHelper您可能已实例化的任何实例。确保如果您正在使用BaseGameActivity您也没有使用GameHelper

  4. 如果要显示单个排行榜,请使用GamesClient.getLeaderboardIntent(string, int)or 方法获取Intent. 该字符串是您拥有的代码 (CgkIx****AIQAA)。

    startActivityForResult(gameHelper.getGamesClient().getLeaderboardIntent(
            leaderboard_id, RC_UNUSED);
    

    同样,请确保您使用的是正确的getGamesClient()方法,具体取决于您是使用BaseGameActivity还是GameHelper直接使用。

于 2013-08-25T00:07:14.517 回答
0

以下是如何在没有 BaseGameActivity 的情况下使用 GameHelper 的基本信息:

https://developers.google.com/games/services/android/init#using_gamehelper_without_basegameactivity

于 2014-08-06T07:43:35.757 回答