Android ゲームに関する問題のトラブルシューティング

このページでは、Play ゲーム 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 リソースの定義を見つけます。通常は、res/xml/strings.xmlres/xml/ids.xml など、res/xml ディレクトリにある XML ファイルで定義されます。

  3. @string/app_id リソースの値がアプリケーションの数値 ID と一致していることを確認します。このリソースの値には、数字のみを使用してください。例:

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

パッケージ名を確認する

ゲームのパッケージ名がクライアント ID のパッケージ名と一致している必要があります。パッケージ名を確認するには:

  1. AndroidManifest.xml を開いて、ゲームのパッケージ名が正しいことを確認します。パッケージ名は、manifest タグの package 属性の値です。
  2. クライアント ID の作成時に指定したパッケージ名を確認します。Google Play Console でパッケージ名を確認するには、Google Play Console に移動して、ゲームに対応するエントリをクリックします。[リンク済みアプリ] タブに移動して、クライアント ID のリストを調べます。このリストに、AndroidManifest.xml のパッケージ名と一致するパッケージ名の Android リンク済みアプリが含まれている必要があります。
  3. パッケージ名が一致していない場合は、正しいパッケージ名で新しいクライアント ID を作成し、再度ログインを試行します。

証明書のフィンガープリントをチェックする

ゲームの署名に使用する証明書が、クライアント ID に関連付けられている証明書のフィンガープリントと一致している必要があります。これを確認するには、まず証明書の SHA1 フィンガープリントを確認します。

  1. 証明書ファイルを探して、SHA1 フィンガープリントを取得します。SHA1 フィンガープリントを取得するには、次のコマンドを実行します。

    keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -v
    
  2. 出力内で SHA1: というラベルが付加されている 16 進数のシーケンスをメモします。これが証明書のフィンガープリントです。

次に、ビルドツールがこの証明書を使用していることを確認します。

  1. ビルドツールでゲームの 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: というラベルが付加されている行の 16 進数のシーケンスをメモします。

    この数字のシーケンスが、前のステップでメモした証明書のフィンガープリントと一致する必要があります。一致しない場合は、ビルドツールまたはシステムが、証明書を使用してアプリに署名するように構成されていません。その場合は、ビルド環境のマニュアルを参照して証明書の正しい構成方法を確認した後、再度ログインを試みてください。

次に、証明書のフィンガープリントが、クライアント ID で構成されているフィンガープリントと一致するかどうかを確認します。方法は次のとおりです。

  1. Google Play Console を開き、ゲームに移動します。
  2. [ゲームの詳細] ページで、下部までスクロールして、リンク済み Google Cloud Platform プロジェクトへのリンクをクリックします。
  3. Google Cloud Platform でプロジェクトを選択します。
  4. 左側にあるサイドバーで、[API と認証] を選択します。表示された API のリストで Google Play ゲームサービス API のステータスが [オン] になっていることを確認します。
  5. 左側にあるスライドバーで [登録済みアプリケーション] を選択します。
  6. [OAuth 2.0 クライアント ID] セクションを展開し、証明書フィンガープリント(SHA1)をメモします。

このフィンガープリントが、前の手順でメモした証明書のフィンガープリントと一致しない場合は、正しい証明書のフィンガープリントを使用して新しいクライアント ID を作成する必要があります。新しいクライアント ID は、Google Cloud Platform ではなく Google Play Console で作成する必要があります。

テスト アカウントが有効になっていることを確認する

ゲームを公開する前に、Google Play Console でゲームの作成に使用したアカウントを、テスト アカウントとしても有効にする必要があります。正しく構成されていることを確認するには:

  1. Google Play Console を開き、ゲームに移動します。
  2. [テスト] タブを開きます。
  3. ログインに使用するアカウントが、テスターのリストに含まれていることを確認します。

ログインに使用するアカウントがリストに含まれていない場合は、リストに追加し、数分待ってから再度ログインしてみてください。

Proguard の問題

Proguard を使用して難読化した APK でエラーが発生する場合は、AndroidManifest.xml のターゲット API レベルをチェックしてください。レベルは 17 以上に設定する必要があります。

その他の原因による設定関連の問題

その他のよくあるエラー原因がないか、次の項目をチェックします。

  • ゲームが公開されている場合は、ゲームの設定も公開されているかチェックします(ゲームの設定を公開せずにアプリが公開されている可能性があります)。これを行うには、Google Play Console に移動して、アプリに移動し、ゲーム名の横にあるボックスが公開済みであることを示しているか確認します。別の状態([公開の準備完了] や [テストの準備完了] など)になっている場合は、このボックスをクリックして [ゲームを公開する] を選択します。
  • ゲームを公開できない場合は、クライアント ID のいずれか 1 つのみで [このアプリは新たなインストールにおすすめです] オプションが有効となっているかチェックします。

匿名リスナー

匿名リスナーは使用しないでください。匿名リスナーは、以下に示すように、インラインで定義されるリスナー インターフェースの実装です。

    ImageManager im = ...;

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

匿名リスナーは、Play Games 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...
        }
    }