如何连接到 google play 服务并加载排行榜

Posted

技术标签:

【中文标题】如何连接到 google play 服务并加载排行榜【英文标题】:how to connect to google play service and load leaderboard 【发布时间】:2013-08-27 14:45:46 【问题描述】:

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

我有 import baseGameUtils,但我使用 andengine,所以我没有使用谷歌的 extends 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。但我没有找到我必须将此代码放在哪里才能加载排行榜。

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

更新,我的截取代码

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



【问题讨论】:

【参考方案1】:

    是的。查看BaseGameActivity 源代码,发现它在很大程度上只是包装了GameHelper。您可以自己实现对GameHelper 的调用——事实上,您可以直接从BaseGameActivity 复制一些代码。我有点困惑,因为您的代码似乎已经在使用GameHelper。看起来您正在将 GameHelper 电话与 BaseGameActivity 电话混合使用。你不能这样做,它会导致......像你一样的错误。

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

    gameHelper = new GameHelper(this);
    gameHelper.setup(this, GameHelper.CLIENT_GAMES | GameHelper.CLIENT_PLUS);
    

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

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

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

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

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

【讨论】:

我已经用我的代码更新了我的问题。 1.我没有扩展BaseGameActivity。所以这意味着我可以直接使用 GameHelper 与 BaseGameActivity 类似的代码? 2.什么是客户代表?那是多人游戏吗? 3. 我也想过设置。我把它放在 beginUserInitiatedSignin() 之前。gameHelper.setup(this, GameHelper.CLIENT_GAMES, Scopes.GAMES);什么也没有发生。 4. 我已经尽力了。但仍然找不到正确使用 GamesClient() 的方法。 1.是的。 2. 在这种情况下,客户端是 API 客户端。您想使用 Google Play 游戏服务客户端获取成就和排行榜。多人游戏也需要 Plus 客户端。 3. 如果您只使用游戏客户端,只需在gameHelper = new GameHelper(this); 之后立即拨打gameHelper.setup()。您对设置的调用非常错误 - 您只能将整数标志 Client_NONE、Client_GAMES、Client_PLUS、CLient_APPSTATE 或 Client_ALL 传递给它(或前 4 个 OR 的某种组合)。 我注意到你的意思是我将 gameHelper 与 baseGameActivity 混合。目前我已经按照你说的放了代码。但它仍然没有调用监听器。目前,当我运行 BeginUserInitiatedSignIn() 时运行良好,但在选择我的 id 后,我的 gameHelper.isSignedIn() 仍然是错误的。而且当然。有什么建议吗?? 您现在可能遇到了密钥问题。您是否在 Play 控制台中发布了您的 Google Play 游戏服务设置?您确定用于签署 APK 的密钥与您用于创建 GPGS 项目的密钥匹配吗?在 *** 上搜索,你会发现很多关于 GPGS 登录失败的讨论。就个人而言,有时即使一切设置正确,我的调试 APK 也可能会或可能不会正确登录。【参考方案2】:

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

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

【讨论】:

以上是关于如何连接到 google play 服务并加载排行榜的主要内容,如果未能解决你的问题,请参考以下文章

Android - “连接到 Google Play”仍然给出错误代码 4?

为啥我的google play一直显示网络连接失败?

无法连接到 google play 服务

我们如何查看 Google Play 服务中的排行榜详情?

如何从 Google Play 游戏服务的排行榜中获得排名?

Google Play 服务 Unity 插件显示排行榜