本页介绍了如何排查使用 Play 游戏 SDK 开发 Android 游戏时可能遇到的问题。

无法登录

如果您无法让玩家登录游戏,请首先确保已按照相关说明创建客户端 ID 并配置游戏服务。如果您仍然遇到登录错误,请检查以下各项,确保您的游戏设置正确。

检查元数据标记

AndroidManifest.xml
<meta-data android:name="com.google.android.gms.games.APP_ID"
    android:value="@string/app_id" />
<string name="app_id">123456789012</string>

检查软件包名称

游戏的软件包名称必须与客户端 ID 上的软件包名称一致。若要验证软件包名称,请执行以下操作:

AndroidManifest.xmlmanifestpackageAndroidManifest.xml

检查证书指纹

您用于为游戏签名的证书应与您的客户端 ID 所关联的证书指纹一致。要验证这一点,请先检查证书的 SHA1 指纹:

keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -v

接下来,检查您的构建工具是否使用此证书:

unzip YourGame.apk
keytool -printcert -file META-INF/CERT.RSA
keytool -printcert -file META-INF/CERT.DSA

接下来,检查证书指纹是否与客户端 ID 中配置的指纹一致。具体方法如下:

  1. 打开 Google Play 管理中心,找到您的游戏。
  2. 游戏详情页面上,滚动到底部,然后点击指向关联的 Google Cloud Platform 项目的链接。
  3. 在 Google Cloud Platform 中,选择您的项目。
  4. 在左侧边栏中,选择 API 和身份验证。在显示的 API 列表中,确保 Google Play 游戏服务 API 的状态为启用
  5. 在左侧边栏中,选择已注册的应用
  6. 展开 OAuth 2.0 客户端 ID 部分,记下证书指纹 (SHA1)。

如果此指纹与上一步中的证书指纹不一致,您必须使用正确的证书指纹创建新的客户端 ID。您必须在 Google Play 管理中心(而非 Google Cloud Platform)中创建新的客户端 ID。

检查测试帐号是否已启用

在游戏发布之前,还必须将 Google Play 管理中心内创建游戏的帐号添加为测试人员。如需检查此项配置是否正确,请执行以下操作:

  1. 打开 Google Play 管理中心,找到您的游戏。
  2. 打开测试标签页。
  3. 检查您尝试登录的帐号是否在测试人员列表中。

如果您尝试登录的帐号未列出,请将其添加到列表中,然后等待几分钟,并尝试重新登录。

Proguard 问题

AndroidManifest.xml

导致设置问题的其他原因

检查是否存在导致错误的其他常见原因:

  • 如果您的游戏已发布,请检查是否也发布了游戏设置(可能出现发布应用但未发布游戏设置的情况)。为此,请转到 Google Play 管理中心并转到您的应用,然后检查游戏名称旁边的复选框是否表明该游戏已发布。如果指示游戏处于其他状态(例如“可以发布”或“可供测试”),请点击该方框并选择发布游戏
  • 如果您无法发布游戏,请检查是否只有一个客户端 ID 启用了此应用是新用户的安装首选选项。

匿名监听器

请勿使用匿名监听器。匿名监听器是监听器接口的实现,以内嵌方式定义,如下所示。

    ImageManager im = ...;

    // Anonymous listener -- dangerous:
    im.loadImage(new ImageManager.OnImageLoadedListener() {
        @Override
        public void onImageLoaded(Uri uri, Drawable drawable) {
            // ...code...
        }
    }
Activity
    public class MyActivity extends Activity
            implements ImageManager.OnImageLoadedListener {

        private void loadOurImages() {
            ImageManager im = ...;
            im.loadImage(this);
        }

        @Override
        public void onImageLoaded(Uri uri, Drawable drawable) {
            // ...code...
        }
    }