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

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配置:
    1. 添加网络权限:
      <uses-permission android:name="android.permission.INTERNET" />
      
    2. 在<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:20:35