热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java尝试使用LibGDX登录GooglePlay游戏服务时出现“signInSilently():失败”

在过去的三天里,我一直在尝试将GoogleGameServices添加到我的LibGDX项目中,起初我尝试了LibGDX教程,但它们似乎都已过时.然后建议我使用GoogleGameSer

在过去的三天里,我一直在尝试将Google Game Services添加到我的LibGDX项目中,起初我尝试了LibGDX教程,但它们似乎都已过时.然后建议我使用Google Game Services官方代码

LibGDX: How to Implement Google Play Game Services?

我导入了示例项目TypeANumber,并尝试将代码添加到我的项目中,但是当我尝试登录时,出现“ signInSilently():失败”错误,当我尝试打开排行榜和成就时,该错误崩溃调试并签名APKS.

这是我的代码:

AndroidLauncher:

private void signInSilently() {
Log.d(TAG, "signInSilently()");
mGoogleSignInClient.silentSignIn().addOnCompleteListener(this, new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { Log.d(TAG, "signInSilently(): success"); onConnected(task.getResult()); } else { Log.d(TAG, "signInSilently(): failure", task.getException()); onDisconnected(); } } });
}
@Override
public void showLeaderboards(){
runOnUiThread(new Runnable() {
public void run() {onShowLeaderboardsRequested();
}
});
}
@Override
public void showAchievements(){
runOnUiThread(new Runnable() {
public void run() {onShowAchievementsRequested();
}
});
}

表现:


package="com.harrybanda.blaster" >



android:value="@string/app_id" />
android:value="@integer/google_play_services_version"/>
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/GdxTheme" >
android:name="com.google.android.gms.ads.AdActivity"
android:cOnfigChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:theme="@android:style/Theme.Translucent" />
android:name="com.harrybanda.blaster.AndroidLauncher"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:cOnfigChanges="keyboard|keyboardHidden|orientation|screenSize">





在我的build.gradle中,我添加了:

compile "com.google.android.gms:play-services-games:11.8.0"
compile "com.google.android.gms:play-services-auth:11.8.0"

Logcat:

01-07 09:56:30.011 618-618/? D/Blaster: onResume()
01-07 09:56:30.011 618-618/? D/Blaster: signInSilently()
01-07 09:56:30.512 618-618/? D/Blaster: signInSilently(): failure com.google.android.gms.common.api.b: 4: at com.google.android.gms.common.internal.y.a(Unknown Source) at com.google.android.gms.common.internal.ae.a(Unknown Source) at com.google.android.gms.common.internal.af.a(Unknown Source) at com.google.android.gms.common.api.internal.BasePendingResult.c(Unknown Source) at com.google.android.gms.common.api.internal.BasePendingResult.a(Unknown Source) at com.google.android.gms.auth.api.signin.internal.g.a(Unknown Source) at com.google.android.gms.auth.api.signin.internal.r.onTransact(Unknown Source) at android.os.Binder.execTransact(Binder.java:451)
01-07 09:56:30.512 618-618/? D/Blaster: onDisconnected()

解决方法:

从问题的第一眼看,似乎您将元数据保留在application标签之外,但应放在AndroidManifest.xml文件中的application标签内

像这样 :

android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/GdxTheme" >
android:name="com.google.android.gms.ads.AdActivity"
android:cOnfigChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:theme="@android:style/Theme.Translucent" />
android:name="com.harrybanda.blaster.AndroidLauncher"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:cOnfigChanges="keyboard|keyboardHidden|orientation|screenSize">







StatusCode 4 (SIGN_IN_REQUIRED) error means client attempted to

connect to the service but the user is not signed in.

这是我的AndroidLauncher类

public class AndroidLauncher extends AndroidApplication implements MyServices {
private GoogleSignInClient mGoogleSignInClient;
private LeaderboardsClient mLeaderboardsClient;
private PlayersClient mPlayersClient;
private static final String TAG=AndroidLauncher.class.getSimpleName();
private static final int RC_SIGN_IN = 9001;
private static final int RC_UNUSED = 5001;
private static final int RC_LEADERBOARD_UI = 9004;
private String greetingMsg="Welcome, ";
private boolean greetingDisplayed;
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
greetingDisplayed=false;
AndroidApplicationConfiguration cOnfig= new AndroidApplicationConfiguration();
initialize(new GdxGame(this), config);
mGoogleSignInClient = GoogleSignIn.getClient(this,
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN).build());
}
@Override
public boolean isSignedIn() {
return GoogleSignIn.getLastSignedInAccount(this) != null;
}
private void signInSilently() {
mGoogleSignInClient.silentSignIn().addOnCompleteListener(this,
new OnCompleteListener() {@Overridepublic void onComplete(@NonNull Task task) { if (task.isSuccessful()) { greetingMsg="Welcome back, "; onConnected(task.getResult()); } else { onDisconnected(); }}
});
}
private void onConnected(GoogleSignInAccount googleSignInAccount) {
mLeaderboardsClient = Games.getLeaderboardsClient(this, googleSignInAccount);
mPlayersClient = Games.getPlayersClient(this, googleSignInAccount);
mPlayersClient.getCurrentPlayer()
.addOnCompleteListener(new OnCompleteListener() {@Overridepublic void onComplete(@NonNull Task task) { String displayName; if (task.isSuccessful()) { displayName = task.getResult().getDisplayName(); } else { Exception e = task.getException(); handleException(e, getString(R.string.players_exception)); displayName = "???"; } if(!greetingDisplayed) welcomeMessage(displayName);}
});
}
private void welcomeMessage(String name){
Toast toast = Toast.makeText(this, greetingMsg + name, Toast.LENGTH_LONG);
toast.setGravity(Gravity.TOP, 0, 0);
View view = toast.getView();
TextView text = (TextView) view.findViewById(android.R.id.message);
toast.show();
greetingDisplayed=true;
}
@Override
public void startSignInIntent() {
startActivityForResult(mGoogleSignInClient.getSignInIntent(), RC_SIGN_IN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == RC_SIGN_IN) {
Task task = GoogleSignIn.getSignedInAccountFromIntent(intent);
try {
GoogleSignInAccount account = task.getResult(ApiException.class);
greetingMsg="Welcome, ";
onConnected(account);
} catch (ApiException apiException) {
String message = apiException.getMessage();
if (message == null || message.isEmpty()) {message = getString(R.string.signin_other_error);
}
onDisconnected();
}
}
}
@Override
protected void onResume() {
super.onResume();
signInSilently();
}
private void signOut() {
if (!isSignedIn()) {
Log.w(TAG, "signOut() called, but was not signed in!");
return;
}
mGoogleSignInClient.signOut().addOnCompleteListener(this,
new OnCompleteListener() {@Overridepublic void onComplete(@NonNull Task task) { boolean successful = task.isSuccessful(); Log.d(TAG, "signOut(): " + (successful ? "success" : "failed")); onDisconnected();}
});
}
private void onDisconnected() {
mLeaderboardsClient = null;
mPlayersClient = null;
}
@Override
public void submitScore(int score){
if(isSignedIn())
mLeaderboardsClient.submitScore(getString(R.string.leaderboard_id), score);
}
@Override
public void showLeaderBoard() {
if(isSignedIn())
mLeaderboardsClient.getLeaderboardIntent(getString(R.string.leaderboard_id))
.addOnSuccessListener(new OnSuccessListener() {@Overridepublic void onSuccess(Intent intent) { startActivityForResult(intent, RC_LEADERBOARD_UI);}
});
}
private void handleException(Exception e, String details) {
int status = 0;
if (e instanceof ApiException) {
ApiException apiException = (ApiException) e;
status = apiException.getStatusCode();
}
String message = getString(R.string.status_exception_error, details, status, e);
new AlertDialog.Builder(this)
.setMessage(message)
.setNeutralButton(android.R.string.ok, null)
.show();
}
}

和MyServices界面

interface MyServices{
void startSignInIntent();
boolean isSignedIn();
void showLeaderBoard();
void submitScore(int score);
}

用户安装应用程序后,第一次由我自己调用接口的startSignInIntent().


推荐阅读
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • This article explores the process of integrating Promises into Ext Ajax calls for a more functional programming approach, along with detailed steps on testing these asynchronous operations. ... [详细]
  • 在AngularJS中,有时需要在表单内包含某些控件,但又不希望这些控件导致表单变为脏状态。例如,当用户对表单进行修改后,表单的$dirty属性将变为true,触发保存对话框。然而,对于一些导航或辅助功能控件,我们可能并不希望它们触发这种行为。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文介绍了一种在 Android 开发中动态修改 strings.xml 文件中字符串值的有效方法。通过使用占位符,开发者可以在运行时根据需要填充具体的值,从而提高应用的灵活性和可维护性。 ... [详细]
  • Kubernetes Services详解
    本文深入探讨了Kubernetes中的服务(Services)概念,解释了如何通过Services实现Pods之间的稳定通信,以及如何管理没有选择器的服务。 ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • 本文详细探讨了编程中的命名空间与作用域概念,包括其定义、类型以及在不同上下文中的应用。 ... [详细]
  • 使用jQuery与百度地图API实现地址转经纬度功能
    本文详细介绍了如何利用jQuery和百度地图API将地址转换为经纬度,包括申请API密钥、页面构建及核心代码实现。 ... [详细]
  • 本文介绍如何通过Java代码调用阿里云短信服务API来实现短信验证码的发送功能,包括必要的依赖添加和关键代码示例。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
author-avatar
月逝彼山
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有