如何连接到 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
呼叫混用。连接的GameHelper
是BaseGameActivity.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?