年齢のシグナルをリクエストする

このドキュメントでは、Play Age Signals API を使用して年齢シグナルをリクエストする方法について説明します。

Play Age Signals 0.0.4 SDK には、年齢シグナルのリクエストを簡素化し、ユーザー チョイスに基づくモデルをサポートするように設計された 2 つの関数アーキテクチャが導入されています。年齢シグナルをリクエストするには、次のワークフローを使用します。

requestAgeSignalsAccess(Activity) メソッドを呼び出します。このメソッドは ageSignalsStatus を返します。ageSignalsStatus の値は、SHAREDNOT_SHARED、または VERIFICATION_REQUIRED のいずれかになります。

  • ageSignalsStatus == NOT_SHARED の場合、アプリは API レスポンスで年齢シグナルを取得しません。
  • ageSignalsStatus == SHARED の場合、checkAgeSignals() メソッドを呼び出します。ユーザーまたは保護者が年齢シグナルを共有することに同意した場合、API レスポンスの一部として年齢シグナルを受け取り、レスポンスの処理方法を決定できます。
  • ageSignalsStatus == VERIFICATION_REQUIRED の場合、ユーザーの年齢が不明で、年齢確認と年齢シグナルの共有が義務付けられている管轄区域または地域にユーザーが居住しています。これらの地域で Google Play から年齢シグナルを取得するには、Google Play ストアにアクセスしてステータスを解決するようユーザーに依頼してください。

requestAgeSignalsAccess(Activity) メソッドは、地域で年齢の共有が義務付けられているかどうかによって異なる値を返します。

  • アプリストアに対してデベロッパーに確認済みの年齢情報を提供するよう義務付ける法律がある米国の州に居住する対象ユーザーの場合、アプリ内プロンプトはトリガーされません。 代わりに、ユーザーが Google Play ストア アプリにアクセスしたときに、年齢確認または管理機能の設定を求められます。ageSignalsStatus の値を使用して、確認ステータスを判断します。
  • 年齢の共有がユーザーまたは保護者の選択に基づく他の地域のユーザーの場合:
    • ユーザーの設定が [共有する前に確認する] の場合、アプリ内プロンプトが 表示されます。ユーザーが年齢を共有することに同意した場合、 ageSignalsStatus の値は SHARED になります。同意しない場合は NOT_SHARED になります。
    • ユーザーの設定が [常に共有する] の場合、アプリ内プロンプトは 表示されず、ageSignalsStatus の値は SHARED になります。
    • ユーザーの設定が [共有しない] の場合、アプリ内プロンプトは表示されず、ageSignalsStatus の値は NOT_SHARED になります。
    • 管理対象ユーザーの場合、保護者はファミリー リンク アプリの設定で、お子様の年齢を共有するかどうかを選択できます。保護者が年齢を共有することを選択した場合、ageSignalsStatus の値は SHARED になります。それ以外の場合は NOT_SHARED になります。

次の画像は、Play の設定で [共有する前に確認する] 年齢層を構成する方法を示しています。

Google Play の設定メニューに表示された年齢の共有オプション(共有前に確認、常に共有、共有しない)
図 1.Play の設定で年齢の共有を管理します。

次の画像は、API を介して年齢がリクエストされ、ユーザーの設定が [共有する前に確認する] の場合に、ユーザーに表示されるアプリ内の年齢層共有リクエストを示しています。

アプリ内で年齢層をアプリと共有するようユーザーに求める同意ダイアログ。
図 2.アプリ内の年齢層共有リクエスト。

次の画像は、ユーザーが特定のアプリの年齢共有を有効または無効にする方法を示しています。

特定のアプリの設定ダイアログに、年齢層の共有を有効または無効にする切り替えスイッチが表示されている
図 3.特定のアプリの年齢共有を有効または無効にします。

次の例は、年齢シグナルをリクエストする方法を示しています。

Kotlin

// 1. Initialize the AgeSignalsManager (usually in onCreate or class initialization)
val ageSignalsManager = AgeSignalsManagerFactory.create(applicationContext)

// 2. Request or check for age signals access.
// Passing the current Activity allows the Play Store to render the age sharing prompt UI if required.
val accessRequest = AgeSignalsAccessRequest.builder()
    .setActivity(this)
    .build()

ageSignalsManager.requestAgeSignalsAccess(accessRequest)
    .addOnSuccessListener { accessResult ->
        if (accessResult.ageSignalsStatus() == AgeSignalsStatus.SHARED) {
            // The user (or parent) has agreed to share age range, or is in an eligible auto-share region.
            // Retrieve the actual age signals.
            retrieveAgeSignals(ageSignalsManager)
        } else {
            // Age signals are not shared (user didn't share age range, parent rejected the request, or not eligible).
        }
    }
    .addOnFailureListener { exception ->
        // Handle API/Play Store connection and system errors
        handleAgeSignalsError(exception)
    }

private fun retrieveAgeSignals(manager: AgeSignalsManager) {
    // 3. Perform the actual age signals query once sharing is active.
    manager.checkAgeSignals(AgeSignalsRequest.builder().build())
        .addOnSuccessListener { ageSignalsResult ->
            val installId = ageSignalsResult.installId()
            val ageLower = ageSignalsResult.ageLower()
            val ageUpper = ageSignalsResult.ageUpper()
            val significantChangeDate = ageSignalsResult.significantChangeApprovalDate()
            val ageRangeSource = ageSignalsResult.ageRangeSource()

            if (ageLower != null) {
                if (ageUpper != null) {
                    // The user is in a specific closed age range [ageLower, ageUpper] (e.g. [13, 15])
                } else {
                    // The user is in the highest open-ended age band [ageLower, null] (e.g. [18, null])
                }
            } else {
                // Both bounds are null: The user is not sharing their age (e.g. they are a verified adult)
            }
        }
        .addOnFailureListener { exception ->
            handleAgeSignalsError(exception)
        }
}

Java

// 1. Initialize the AgeSignalsManager (usually in onCreate or class initialization)
AgeSignalsManager ageSignalsManager = AgeSignalsManagerFactory.create(getApplicationContext());

// 2. Request or check for age signals access.
// Passing the current Activity allows the Play Store to render the age sharing prompt UI if required.
AgeSignalsAccessRequest accessRequest = AgeSignalsAccessRequest.builder()
    .setActivity(this)
    .build();

ageSignalsManager.requestAgeSignalsAccess(accessRequest)
    .addOnSuccessListener(accessResult -> {
        Integer status = accessResult.ageSignalsStatus();
        if (status == AgeSignalsStatus.SHARED) {
            // The user (or parent) has agreed to share age range, or is in an eligible auto-share region.
            // Retrieve the actual age signals.
            retrieveAgeSignals(ageSignalsManager);
        } else {
            // Age signals are not shared (user didn't share age range, parent rejected the request, or not eligible).
        }
    })
    .addOnFailureListener(exception -> {
        // Handle API/Play Store connection and system errors
    });

private void retrieveAgeSignals(AgeSignalsManager manager) {
    // 3. Perform the actual age signals query once sharing is active.
    manager.checkAgeSignals(AgeSignalsRequest.builder().build())
        .addOnSuccessListener(ageSignalsResult -> {
            String installId = ageSignalsResult.installId();
            Integer ageLower = ageSignalsResult.ageLower();
            Integer ageUpper = ageSignalsResult.ageUpper();
            Date significantChangeDate = ageSignalsResult.significantChangeApprovalDate();
            @AgeRangeSource Integer ageRangeSource = ageSignalsResult.ageRangeSource();

            if (ageLower != null) {
                if (ageUpper != null) {
                    // The user is in a specific closed age range [ageLower, ageUpper] (e.g. [13, 15])
                } else {
                    // The user is in the highest open-ended age band [ageLower, null] (e.g. [18, null])
                }
            } else {
                // Both bounds are null: The user is not sharing their age (e.g. they are a verified adult)
            }
        })
        .addOnFailureListener(exception -> {
            handleAgeSignalsError(exception);
        });
}

コードに関する主なポイント

  • requestAgeSignalsAccess(Activity) メソッドは、ユーザーの現在の年齢シグナルと年齢シグナルの共有ステータスのブロッキング チェックを実行します。
  • requestAgeSignalsAccess(Activity) を呼び出すと、Play は管理対象外のユーザーに対してのみ、組み込みのアプリ内プロンプトを表示します。管理対象ユーザーの保護者は、ファミリー リンク アプリで年齢共有の設定を管理することで、お子様の年齢を共有するかどうかを選択できます。
  • ユーザーが年齢の共有を拒否した場合、アプリ内プロンプトは数回表示された後に表示されなくなります。
  • checkAgeSignals() メソッドは、API レスポンスで年齢シグナルの値を取得します。このメソッドは、ageRangeSourceageUpperageLower、その他の重要な変更値を返します。