排解 Android 遊戲相關問題

本頁面說明如何排解使用 Play Games SDK 開發 Android 遊戲時可能遇到的問題。

無法登入

如果您無法將玩家登入遊戲,請先確認您已按照建立用戶端 ID設定遊戲服務的說明操作。如果仍然發生登入錯誤,請檢查下列項目,確認遊戲已正確設定。

檢查中繼資料標記

您的 AndroidManifest.xml 內必須含有遊戲的中繼資料標記。驗證中繼資料標記是否設定正確的方法如下:

  1. 開啟 AndroidManifest.xml 並確認其中含有 meta-data 標記,如下所示:

    <meta-data android:name="com.google.android.gms.games.APP_ID"
        android:value="@string/app_id" />
    
  2. 找到 @string/app_id 資源的定義。用來定義資源的 XML 檔案通常位於 res/xml 目錄,例如 res/xml/strings.xmlres/xml/ids.xml

  3. 確認 @string/app_id 資源的值與您應用程式的數字 ID 相符。此資源的值須全部由數字組成。例如:

    <string name="app_id">123456789012</string>
    

檢查套件名稱

遊戲的套件名稱必須與用戶端 ID 中的套件名稱相符。如何確認套件名稱:

  1. 開啟 AndroidManifest.xml 並確認遊戲套件名稱是否正確。套件名稱為 manifest 標記中 package 屬性的值。
  2. 驗證您在建立用戶端 ID 時所提供的套件名稱。如要在 Google Play 管理中心驗證套件名稱,請前往 Google Play 管理中心,並按一下與遊戲對應的項目。 前往「Linked Apps」(連結的應用程式) 分頁標籤檢查用戶端 ID 清單。這份清單中應該有一個 Android 連結的應用程式,其套件名稱與 AndroidManifest.xml 中的套件名稱相符。
  3. 如果不相符,請使用正確的套件名稱建立新的用戶端 ID,並再次嘗試登入。

檢查憑證指紋

用來簽署遊戲的憑證必須與用戶端 ID 相關聯的憑證指紋相符。如要驗證憑證,請先檢查憑證的 SHA1 指紋:

  1. 找到您的憑證檔案並取得其 SHA1 指紋。如需取得 SHA1 指紋,請執行以下指令:

    keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -v
    
  2. 記下輸出內容中標示為 SHA1: 的十六進位數列。此數字即為憑證的指紋。

接著,檢查您的建構工具是否使用這個憑證:

  1. 透過您的建構工具產生遊戲的 APK,並使用想驗證的憑證簽署 APK。將產生的 APK 複製到臨時的目錄。
  2. 在該臨時目錄內執行以下指令,以便解壓縮 APK。

    unzip YourGame.apk
    
  3. 使用 RSA 憑證檔案產生私密金鑰:

    keytool -printcert -file META-INF/CERT.RSA
    

    您也可以使用 DSA 憑證檔案產生私密金鑰:

    keytool -printcert -file META-INF/CERT.DSA
    
  4. 找到標示為 SHA1: 的行,並記下其中的十六進位數列。

    此數列應該與您在上一個步驟中取得的憑證指紋相符。如果數字不相符,代表您的建構工具或系統並非設定使用憑證簽署應用程式。如果遇到這種情況,請參閱建構環境的說明文件,瞭解如何正確設定憑證,然後再次嘗試登入。

接著,檢查憑證指紋是否與用戶端 ID 中設定的指紋相符。如要這麼做,請按照下列指示操作:

  1. 開啟 Google Play 管理中心,然後前往您的遊戲。
  2. 在「Game Details」(遊戲詳細資料) 頁面中,往下捲動到底端並按一下連結,前往已連結的 Google Cloud Platform 專案。
  3. 在 Google Cloud Platform 中選取您的專案。
  4. 點選左側欄的「APIs & auth」。查看系統顯示的 API 清單,並確認 Google Play 遊戲服務 API 的狀態是「ON」(開啟)
  5. 點選左側欄的「Registered apps」(註冊應用程式)。
  6. 展開 OAuth 2.0 用戶端 ID 區段,然後記下憑證指紋 (SHA1)。

如果這個指紋與您在前幾個步驟中取得的憑證指紋不相符,那麼您必須以正確的憑證指紋建立新的用戶端 ID。您必須在 Google Play 管理中心 (而非 Google Cloud Platform) 中建立新的用戶端 ID。

檢查是否已啟用測試帳戶

在遊戲發布前,您在 Google Play 管理中心建立遊戲的帳戶也必須啟用為測試人員。如要檢查是否正確設定,請按照下列步驟操作:

  1. 開啟 Google Play 管理中心,然後前往您的遊戲。
  2. 開啟「Testing」(測試) 分頁標籤。
  3. 確認測試人員清單中是否有您用來登入的帳戶。

如果您嘗試登入的帳戶不在清單中,請將其加入清單中,稍待幾分鐘後再次嘗試登入。

Proguard 問題

如果您使用 Proguard 而且模糊 APK 會顯示錯誤訊息,請檢查 AndroidManifest.xml 內的目標 API 級別,並確實將其設為 17 以上。

其他造成設定問題的原因

檢查其他造成錯誤的常見原因:

  • 如果您已經發布遊戲,請檢查是否也已經發布遊戲設定 (您可能會在發布應用程式時忘了發布遊戲設定)。方法是前往 Google Play 管理中心,前往您的應用程式,然後檢查遊戲名稱旁邊的方塊,表示應用程式已經發布。如果顯示其他狀態,例如「Ready to Publish」(可供發布) 或「Ready to Test」(可供測試),請按一下方塊後點選「Publish Game」(發布遊戲)
  • 如果無法發布遊戲,請看啟用「This app is preferred for new installations」(進行全新安裝時偏好使用此應用程式) 選項的是否只有一個用戶端 ID。

匿名事件監聽器

請勿使用匿名事件監聽器。匿名事件監聽器是定義為內嵌的事件監聽器介面實作,如以下所示。

    ImageManager im = ...;

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

由於 Play 遊戲 SDK 會固定將匿名事件監聽器設為弱式參照,表示垃圾收集器可能會在您叫用之前就回收這些事件監聽器,因此並不穩定。您應改為使用永久性物件 (例如 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...
        }
    }