Android デベロッパー ID ステータス API でアプリの登録ステータスを確認する

Android Developer Status API を使用すると、Android アプリ パッケージ名が確認済みのデベロッパーに登録されているかどうかを確認できます。ソフトウェア開発ツール、IDE、自動化された CI/CD ワークフローを構築する場合は、このサーバー間 API を統合して次のことができます。

  • アプリ パッケージ名が確認済みのデベロッパーに登録されているかどうかを確認する
  • アプリの署名証明書の SHA-256 フィンガープリントが、登録済みパッケージ名のファイルにある認証情報と一致するかどうかを検証する
  • ツールのインターフェース内で、認識されないアプリを Android デベロッパーの確認プログラムに登録するようデベロッパーに促す

この API は、さまざまなデベロッパー ワークフローをサポートするように設計されています。

ユースケース 説明 API エンドポイント
パッケージ名の対象 パッケージ名がすでに登録されているかどうかを確認します。パッケージ名が確認済みのデベロッパーに関連付けられている場合は REGISTERED、それ以外の場合は NOT_REGISTERED を返します。 CheckPackageRegistrationStatus
アプリが登録されている 特定のパッケージ名と証明書フィンガープリントのペアが登録されているかどうかを確認します。パッケージ名と証明書フィンガープリントのペアが登録されている場合は REGISTERED、登録されていない場合は NOT_REGISTERED、パッケージ名が別の証明書フィンガープリントで登録されている場合は REGISTERED_WITH_ANOTHER_CERTIFICATE_FINGERPRINT を返します。 CheckPackageRegistrationStatus

このガイドでは、次のタスクを完了する方法について説明します。

  1. Google Cloud API のアクセスと認証を設定する。
  2. 提供された公開証明書の SHA-256 フィンガープリントまたは別の公開証明書の SHA-256 フィンガープリントを使用して、アプリのパッケージ名と公開証明書の SHA-256 フィンガープリントのペアが、確認済みのデベロッパーによって Android デベロッパーの確認プログラムに登録されているかどうかを確認する。
  3. IDE またはデベロッパー ツールのワークフローで API 登録ステータスを処理する。

前提条件

このドキュメントは、Android アプリ デベロッパーまたはソフトウェア開発ツール デベロッパーを対象としています。始める前に、次のものを用意してください。

  • Google Cloud プロジェクトに対する管理者権限。
  • RESTful API、JSON、SHA-256 証明書フィンガープリントに関する基本的な知識。

以下の用語についても知っておく必要があります。

用語 定義
Android デベロッパーの確認 Android デベロッパーの確認とは、現実世界のエンティティ(個人と組織)を Android アプリに関連付けることを目的とした新しい要件です。これにより、認定済み Android デバイスにユーザーがインストールできるのは、確認済みのデベロッパーによって登録されたアプリのみとなります。
証明書フィンガープリント アプリの署名に使用される公開証明書の SHA-256 ハッシュ。
登録ステータス アプリのパッケージ名、またはアプリのパッケージ名と公開証明書の SHA-256 フィンガープリントのペアに対して API が返すステータス。このステータスによって、実行する必要があるアクションが決まります(REGISTEREDNOT_REGISTERED など)。

サービス エンドポイント

サービス エンドポイントは、API サービスのネットワーク アドレスを指定するベース URL です。このサービスには次のサービス エンドポイントがあり、すべての URI はこのサービス エンドポイントに関連しています。

https://androiddeveloperidstatus.googleapis.com

API を有効にする

Android Developer ID Status API を使用するには、プロジェクトを作成して API を有効にするための設定手順を完了する必要があります。

Google Cloud プロジェクトを作成する

  1. Google Cloud アカウントをお持ちでない場合は、作成します
  2. Google Cloud コンソールを開きます。
  3. Google Cloud プロジェクトを作成します。

プロジェクトで API を有効にする

  1. Google Cloud コンソールで、[API とサービス] > [ライブラリ] に移動します。
  2. プルダウン メニューからプロジェクトを選択します。
  3. Android Developer ID Status API を検索します。
  4. [有効にする] をクリックします。

認証

この API は API キー認証情報をサポートしています。API キーを取得するには:

  1. Google Cloud コンソールで、[API とサービス] > [認証情報] に移動します。
  2. [+ 認証情報を作成] をクリックして [API キー] を選択します。
  3. キーを構成してコピーします。このキーをリクエスト ヘッダーで使用します。

アプリの登録ステータスを確認する

PackageRegistrationStatus リソースに対してクエリを実行して、パッケージ名のみを確認することも、特定の証明書フィンガープリントとペアになっているパッケージ名を確認することもできます。

パッケージ名を確認する

アプリ パッケージ名が確認済みのデベロッパーによって登録されているかどうかを確認するには、Android アプリのパッケージ名(com.example.app など)を含む認証済みの GET リクエストを、省略可能なパラメータなしで packageRegistrationStatus:check エンドポイントに送信します。

リクエスト:

curl -X GET "https://androiddeveloperidstatus.googleapis.com/v1/packages/com.example.app/packageRegistrationStatus:check" \
  -H "X-Goog-Api-Key: [key]"

結果

レスポンス(登録済み):

パッケージ名が登録されている場合は、HTTP レスポンス コード 200 で次の HTTP レスポンス本文が返されます。

{
  "name": "packages/com.example.app/packageRegistrationStatus",
  "state": "REGISTERED"
}

推奨される対応策: 別のデベロッパーに代わってこのチェックを行っている場合は、パッケージ名が登録されていることをデベロッパーに通知します。

レスポンス(未登録):

パッケージ名が登録されていない場合は、HTTP レスポンス コード 200 で次の HTTP レスポンス本文が返されます。

{
  "name": "packages/com.example.app/packageRegistrationStatus",
  "state": "NOT_REGISTERED"
}

推奨される対応策: 別のデベロッパーに代わってこのチェックを行っている場合は、パッケージ名が登録されていないことをデベロッパーに通知します。

Java の例

この Java の例では、クエリ パラメータを指定せずに API を呼び出して、パッケージ名が登録されているかどうかを確認します。

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class CheckPackageNameClient {

  private static final String API_ENDPOINT = "https://androiddeveloperidstatus.googleapis.com";

  public static void main(String[] args) {
    String apiKey = "YOUR_API_KEY";
    String packageName = "com.example.app";

    try {
      String response = checkPackageRegistrationStatus(apiKey, packageName);
      System.out.println("Response: " + response);
    } catch (IOException | InterruptedException e) {
      e.printStackTrace();
    }
  }

  /**
   *   Checks the registration status of an Android package.
   */
  public static String checkPackageRegistrationStatus(String apiKey, String packageName)
      throws IOException, InterruptedException {

    String fullUrl = String.format("%s/v1/packages/%s/packageRegistrationStatus:check", API_ENDPOINT, packageName);

    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(fullUrl))
        .header("Accept", "application/json")
        .header("X-Goog-Api-Key", apiKey)
        .GET()
        .build();

    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

    if (response.statusCode() != 200) {
      throw new IOException("Unexpected response code: " + response.statusCode() + ", body: " + response.body());
    }

    return response.body();
  }
}

パッケージ名と証明書フィンガープリントのペアを確認する

アプリのパッケージ名が特定の公開証明書の SHA-256 フィンガープリントで登録されているかどうかを確認するには、certificateFingerprint クエリ パラメータを渡します。

リクエスト:

curl -X GET "https://androiddeveloperidstatus.googleapis.com/v1/packages/com.example.app/packageRegistrationStatus:check?certificateFingerprint=d6ac89ed1d0a805aad4b087d06d5f41645b814480b133fbc867ef7498d069e06" \
  -H "X-Goog-Api-Key: [key]"

結果

レスポンス(一致する証明書フィンガープリントで登録済み):

パッケージ名が指定された公開証明書の SHA-256 フィンガープリントで登録されている場合は、HTTP レスポンス コード 200 で次の HTTP レスポンス本文が返されます。

{
  "name": "packages/com.example.app/packageRegistrationStatus",
  "state": "REGISTERED"
}

推奨される対応策: 別のデベロッパーに代わってこのチェックを行っている場合は、パッケージ名が指定された証明書フィンガープリントで登録されていることをデベロッパーに通知します。

レスポンス(別の証明書フィンガープリントで登録済み):

パッケージ名が指定されたものとは異なる証明書 SHA-256 フィンガープリントで登録されている場合は、HTTP レスポンス コード 200 で次の HTTP レスポンス本文が返されます。

{
  "name": "packages/com.example.app/packageRegistrationStatus",
  "state": "REGISTERED_WITH_ANOTHER_CERTIFICATE_FINGERPRINT"
}

推奨される対応策: 別のデベロッパーに代わってこのチェックを行っている場合は、パッケージ名が登録されているが、指定されたものとは異なる証明書フィンガープリントで登録されていることをデベロッパーに通知します。

レスポンス(未登録):

パッケージ名が指定された公開証明書の SHA-256 フィンガープリントで登録されていない場合は、HTTP レスポンス コード 200 で次の HTTP レスポンス本文が返されます。

{
  "name": "packages/com.example.app/packageRegistrationStatus",
  "state": "NOT_REGISTERED"
}

推奨される対応策: 別のデベロッパーに代わってこのチェックを行っている場合は、パッケージ名が指定された証明書フィンガープリントで登録されていないことをデベロッパーに通知します。

Java の例

この Java の例では、特定のパッケージとフィンガープリントのペアを確認するために、certificateFingerprint を URL エンコードされたクエリ パラメータとして明示的に含めています。

import java.io.IOException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class CheckPackageAndFingerprintClient {

  private static final String API_ENDPOINT = "https://androiddeveloperidstatus.googleapis.com";

  public static void main(String[] args) {
    String apiKey = "YOUR_API_KEY";
    String packageName = "com.example.app";
    String certificateFingerprint = "d6ac89ed1d0a805aad4b087d06d5f41645b814480b133fbc867ef7498d069e06";

    try {
      String response = checkPackageAndFingerprintRegistrationStatus(apiKey, packageName, certificateFingerprint);
      System.out.println("Response: " + response);
    } catch (IOException | InterruptedException e) {
      e.printStackTrace();
    }
  }

  /**
   *   Checks the registration status of a specific Android package and certificate fingerprint pair.
   */
  public static String checkPackageAndFingerprintRegistrationStatus(
      String apiKey, String packageName, String certificateFingerprint)
      throws IOException, InterruptedException {

    String path = String.format("/v1/packages/%s/packageRegistrationStatus:check", packageName);

    String encodedFingerprint = URLEncoder.encode(certificateFingerprint, StandardCharsets.UTF_8);
    String fullUrl = API_ENDPOINT + path + "?certificateFingerprint=" + encodedFingerprint;

    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(fullUrl))
        .header("Accept", "application/json")
        .header("X-Goog-Api-Key", apiKey)
        .GET()
        .build();

    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

    if (response.statusCode() != 200) {
      throw new IOException("Unexpected response code: " + response.statusCode() + ", body: " + response.body());
    }

    return response.body();
  }
}

登録ステータスとエラー処理について

API リクエストが失敗すると、Android Developer ID Status API はレスポンス本文に標準の Google Cloud JSON エラー オブジェクトを返します。このオブジェクトは、エラーを理解して処理するための整合性のある構造を提供します。

エラー レスポンスの例:

{
  "error": {
    "code": 400,
    "message": "Request contains an invalid argument.",
    "status": "INVALID_ARGUMENT"
  }
}

エラー オブジェクトには、次のキーフィールドが含まれています。

  • code: HTTP ステータス コード(400403500 など)。
  • message: デベロッパー向けの英語でのエラーの説明。このメッセージは安定しておらず、変更される可能性があるため、このメッセージに基づいて解析ロジックを構築しないでください。
  • status: エラータイプをプログラムで識別する標準的なエラーコード(INVALID_ARGUMENTPERMISSION_DENIED など)。エラー処理ロジックは、この安定した識別子に基づいて構築する必要があります。

次の表に、API から返される最も一般的なエラーと、推奨される対応策を示します。

HTTP ステータス 標準的なエラーコード(status 意味と一般的な原因 推奨される対応 再試行できますか?
400 Bad Request(不正なリクエスト) INVALID_ARGUMENT リクエストの形式が正しくありません。 再試行しないでください。エラー レスポンスの詳細フィールドを調べて、特定のフィールド違反を特定します。リクエスト ペイロードを修正して、もう一度送信します。 いいえ
401 Unauthorized(未承認) UNAUTHENTICATED アクセス トークンがないか、有効期限が切れているか、無効です。 すぐに再試行しないでください。正しいアクセス トークンまたはキーを使用していることを確認してください。 いいえ
403 Forbidden(禁止) PERMISSION_DENIED 認証はされていますが、プロジェクトに API へのアクセス権がありません。最も一般的な原因は、Google Cloud プロジェクトで API が有効になっていないことです。 再試行しないでください。正しいプロジェクト ID を使用していることと、API が有効になっていることを確認します。 いいえ
429 Too Many Requests(リクエストが多すぎます) RESOURCE_EXHAUSTED プロジェクトの API 割り当てを超えています。 リクエストの送信を停止し、しばらくしてから再試行してください。Google Cloud コンソールでプロジェクトの割り当てを確認します。 はい
500 Internal Server Error(内部サーバーエラーです) INTERNAL Google のサーバーで予期しないエラーが発生しました。 これは一時的な問題である可能性があります。指数バックオフ戦略を使用してリクエストを再試行してください。エラーが解消されない場合は、サポートまでお問い合わせください。 はい
503 Service Unavailable(サービス利用不可) UNAVAILABLE このサービスは一時的にご利用いただけません。 指数バックオフ戦略を使用してリクエストを再試行してください。 はい

割り当て上限

サービスの信頼性を確保するため、使用量の割り当てはプロジェクトごとに適用されます。

API メソッド デフォルトの上限(プロジェクトごと) メモ
CheckPackageRegistrationStatus 1 日あたり 1,000 回のリクエスト 不正使用を防ぐため、呼び出し元は内部レート制限を管理する必要があります。

使用量をモニタリングする

プロジェクトの現在の API 使用量をモニタリングし、割り当て上限にどれだけ近づいているかを Google Cloud コンソールで直接確認できます。

  1. [API とサービス] > [ダッシュボード] ページに移動します。
  2. Android Developer ID Status API を選択します。
  3. [割り当て] タブをクリックします。

このダッシュボードには、リクエスト数の詳細な内訳が時系列で表示されます。