Kotlin Android集成Google Play Games Services登录及功能实现问题
Kotlin集成Google Play Games Services问题解决指南
一、登录无弹窗/自动登录实现
1. 基础配置检查
- 确保使用最新的Play Games V2 SDK,在
app/build.gradle中添加依赖:dependencies { implementation "com.google.android.gms:play-services-games-v2:23.1.0" implementation "com.google.android.gms:play-services-auth:20.7.0" } - 确认
AndroidManifest.xml配置:- 添加网络权限:
<uses-permission android:name="android.permission.INTERNET" /> - 在
<application>标签内添加游戏ID元数据:
注意<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" />app_id要从Google游戏控制台复制,粘贴到res/values/strings.xml中。
- 添加网络权限:
- 测试账号必须添加到游戏控制台的测试人员列表,且设备登录的Google账号与测试账号一致;同时确保设备的Google Play服务是最新版本。
2. 自动登录+交互式登录代码
用V2 SDK的GamesSignInClient实现,替代旧版登录逻辑:
import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.games.Games import com.google.android.gms.games.GamesSignInClient import android.content.Intent import android.util.Log import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button class MainActivity : AppCompatActivity() { private lateinit var gamesSignInClient: GamesSignInClient private val RC_SIGN_IN = 9001 // 用registerForActivityResult替代弃用的onActivityResult private val signInLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val task = GoogleSignIn.getSignedInAccountFromIntent(result.data) try { task.getResult(ApiException::class.java) handleSignInSuccess() } catch (e: ApiException) { Log.e("GPGS", "登录失败: ${e.statusCode}") } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) gamesSignInClient = Games.getGamesSignInClient(this) // 启动应用时自动尝试静默登录 autoSignIn() val btnLogin = findViewById<Button>(R.id.btn_login) btnLogin.setOnClickListener { startInteractiveSignIn() } } private fun autoSignIn() { gamesSignInClient.silentSignIn() .addOnCompleteListener { task -> if (task.isSuccessful) { handleSignInSuccess() } else { // 静默登录失败,可选择直接触发交互式登录 // startInteractiveSignIn() } } } private fun startInteractiveSignIn() { gamesSignInClient.signInIntent .addOnSuccessListener { intent -> signInLauncher.launch(intent) } .addOnFailureListener { Log.e("GPGS", "获取登录意图失败: ${it.message}") } } private fun handleSignInSuccess() { Log.d("GPGS", "登录成功") // 登录成功后可调用排行榜/成就展示 } }
二、排行榜与成就的正确调用
同样用registerForActivityResult替代弃用的startActivityForResult:
1. 展示排行榜
// 定义排行榜启动器 private val leaderboardLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {} private fun showLeaderboard() { val account = GoogleSignIn.getLastSignedInAccount(this) account?.let { Games.getLeaderboardsClient(this, it) .getLeaderboardIntent("你的排行榜ID") .addOnSuccessListener { intent -> leaderboardLauncher.launch(intent) } .addOnFailureListener { Log.e("GPGS", "打开排行榜失败: ${it.message}") } } ?: run { // 用户未登录,先触发登录 startInteractiveSignIn() } }
2. 展示成就
// 定义成就启动器 private val achievementsLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {} private fun showAchievements() { val account = GoogleSignIn.getLastSignedInAccount(this) account?.let { Games.getAchievementsClient(this, it) .getAchievementsIntent() .addOnSuccessListener { intent -> achievementsLauncher.launch(intent) } .addOnFailureListener { Log.e("GPGS", "打开成就失败: ${it.message}") } } ?: run { startInteractiveSignIn() } }
三、Gradle配置问题(无需allprojects节点)
新版Android Gradle Plugin(AGP 7.0+)已移除allprojects节点,仓库配置放在settings.gradle的dependencyResolutionManagement块中:
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() // 其他所需仓库 } }
不要在项目级build.gradle中添加allprojects,避免报错。
四、常见排查点
- 查看调试日志中的错误码:
- 12500:设备Google Play服务版本过低,需更新
- 4:用户取消登录
- 10:游戏ID配置错误或测试账号未添加
- 确保游戏控制台中的应用签名证书SHA-1与本地打包签名一致(debug/release包都要对应)
内容的提问来源于stack exchange,提问作者mellowInOcean
相关产品推荐
相关产品推荐

