LibGDX集成Google Play游戏服务遇signInSilently(): failure错误求助
解决LibGDX集成Google Play游戏服务的
signInSilently()失败问题 我花了3天时间尝试为LibGDX项目集成Google Play游戏服务,起初用的LibGDX教程全已过时,之后参考官方方案并导入TypeANumber示例项目代码,但不管是调试版还是签名版APK,都出现signInSilently(): failure错误,打开排行榜和成就时还会崩溃。以下是我的相关代码与日志:
AndroidLauncher核心代码
private void signInSilently() { Log.d(TAG, "signInSilently()"); mGoogleSignInClient.silentSignIn().addOnCompleteListener(this, new OnCompleteListener<GoogleSignInAccount>() { @Override public void onComplete(@NonNull Task<GoogleSignInAccount> 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(); } }); }
Manifest配置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.harrybanda.blaster" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="27" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/GdxTheme" > <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" /> <activity android:name="com.harrybanda.blaster.AndroidLauncher" android:label="@string/app_name" android:screenOrientation="portrait" android:configChanges="keyboard|keyboardHidden|orientation|screenSize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
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()
针对性解决步骤
1. 优先排查Google Play开发者控制台配置
错误码4几乎都是客户端身份验证失败导致的,重点检查:
- 确认控制台里的应用包名和你Manifest中的
package="com.harrybanda.blaster"完全一致,大小写、字符都不能错 - 把调试版和发布版的SHA1指纹都添加到控制台的应用签名列表:
- 调试版指纹用命令获取:
keytool -list -v -keystore ~/.android/debug.keystore(默认密码是android) - 发布版指纹用你打包APK的签名文件获取
- 调试版指纹用命令获取:
- 重新下载
google-services.json文件,放到Android模块的app/src/main目录下,它会自动帮你匹配控制台的配置,避免手动写APP_ID出错
2. 更新Play Services依赖版本
你用的11.8.0版本太老旧了,不仅有兼容性问题,还可能存在已修复的登录bug。建议升级到较新的稳定版,同时注意Gradle语法已经从compile改为implementation:
implementation "com.google.android.gms:play-services-games:20.1.0" implementation "com.google.android.gms:play-services-auth:20.7.0"
3. 完善登录流程的错误处理
目前静默登录失败后直接断开连接,会导致用户完全无法登录。正确的做法是在静默登录失败时触发显式登录界面:
@Override public void onComplete(@NonNull Task<GoogleSignInAccount> task) { if (task.isSuccessful()) { Log.d(TAG, "signInSilently(): success"); onConnected(task.getResult()); } else { Log.d(TAG, "signInSilently(): failure", task.getException()); // 静默登录失败,启动显式登录流程 startSignInIntent(); } } // 启动登录界面 private void startSignInIntent() { Intent signInIntent = mGoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN); // RC_SIGN_IN可以定义为常量,比如1001 } // 处理登录结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { GoogleSignInAccount account = task.getResult(ApiException.class); onConnected(account); } catch (ApiException e) { Log.w(TAG, "登录失败,错误码: " + e.getStatusCode()); onDisconnected(); } } }
4. 检查GoogleSignInClient初始化配置
确保你初始化mGoogleSignInClient时,正确指定了游戏服务的登录范围:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestEmail() // 可选,按需添加 .build(); mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
5. 测试环境注意事项
- 调试时,设备上登录的Google账号必须是你在开发者控制台添加的测试账号,未添加的账号会被游戏服务拒绝登录
- 确保设备上的Google Play服务是最新版本,去应用商店更新后再测试
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

