You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:45:10