為 Android 設定 AdServices

請按照以下操作說明宣告 API 專屬權限,並設定 SDK 對於目標 API 所管理資源的存取權。

宣告 AdServices API 專屬權限

您必須具備廣告服務 normal 權限,才能存取每個 PPAPI。在資訊清單中,請宣告應用程式或 SDK 所需 API 相應的適當存取權限。

Attribution Reporting API:

<uses-permission android:name="android.permission.ACCESS_ADSERVICES_ATTRIBUTION" />

Attribution Reporting API (包含偵錯報表):

<uses-permission android:name="android.permission.ACCESS_ADSERVICES_ATTRIBUTION" />
<uses-permission android:name="android.permission.ACCESS_ADSERVICES_AD_ID" />

Protected Audience/Custom Audience API:

<uses-permission android:name="android.permission.ACCESS_ADSERVICES_CUSTOM_AUDIENCE" />

Topics API:

<uses-permission android:name="android.permission.ACCESS_ADSERVICES_TOPICS" />

如要使用 Attribution Reporting API 接收偵錯報表,請視需要加入 AD_ID 權限:

<uses-permission android:name="android.permission.ACCESS_ADSERVICES_AD_ID" />

如果專案具有模組或 SDK 的依附元件,可能已在資訊清單檔案中宣告必要的廣告服務權限。根據預設,Gradle 建構作業會將所有資訊清單檔案合併為一個資訊清單檔案,並封裝到應用程式套件中。請透過「Merged Manifest」檢視畫面確認已使用正確權限。

如果您需要避免透過 SDK 等依附元件將任何權限合併到應用程式,請為特定權限加入 remove 節點標記。以下範例說明如何避免合併 Topics 權限。

<uses-permission android:name="android.permission.ACCESS_ADSERVICES_TOPICS"
    tools:node="remove" />

設定 API 專屬廣告服務

與 PPAPI 存取權限類似,每個 API 在廣告服務設定中都有對應項目。您可以使用這項設定,針對應用程式或內嵌 SDK 中受 API 管理的資源,進行精細的存取權控管。在資訊清單中指定 adservicesConfig 屬性,如以下範例所示:

<application ...>
      ...
    <property android:name="android.adservices.AD_SERVICES_CONFIG"
        android:resource="@xml/ad_services_config" />

      ...
</application>

指定資訊清單所參照的廣告服務 XML 資源,例如 res/xml/ad_services_config.xml。針對適用於應用程式 (或內嵌 SDK) 的每個隱私權保護 API,將 allowAllToAccess 屬性設為 true,對所有呼叫端授予存取權。

或者,您可以使用 allowAdPartnersToAccess 屬性,針對每項廣告技術授予精細的 API 存取權。這時,您需要提供開發人員透過註冊取得的註冊帳戶 ID 清單。如果 allowAllToAccess 屬性設定為 true,則此屬性的優先順序會高於 allowAdPartnersToAccess 屬性中指定的任何註冊帳戶 ID。

廣告技術平台也應確保其應用程式用戶端能正確授予廣告服務設定中必要隱私權保護 API 的存取權。

以下範例說明如何指定廣泛存取權,確保任何註冊帳戶 ID 都能存取所有隱私權保護 API:

<ad-services-config>
   <!-- Attribution API -->
   <attribution allowAllToAccess="true" />

   <!-- Topics API -->
   <topics allowAllToAccess="true" />

   <!-- Protected Audience on Android API -->
   <custom-audiences allowAllToAccess="true" />
</ad-services-config>

以下範例說明如何針對特定註冊帳戶 ID,為每個隱私權保護 API 指定精細存取權:

<ad-services-config>
    <!-- Attribution API -->
    <attribution allowAdPartnersToAccess="ENROLLMENT-ID" allowAllToAccess="false" />

    <!-- Topics API -->
    <includes-sdk-library name="ENROLLMENT-ID" />
    <topics allowAdPartnersToAccess="ENROLLMENT-ID" allowAllToAccess="false" />

    <!-- Protected Audience on Android API -->
    <custom-audiences allowAdPartnersToAccess="ENROLLMENT-ID" allowAllToAccess="false" />
</ad-services-config>

宣告 Jetpack 程式庫依附元件

使用 ads-adservices Jetpack 程式庫 1.0.0-beta01 以上版本,以整合 Privacy Sandbox 的隱私權保護 API。您可以使用這個程式庫,從平台層級詳細資訊中提取您的應用程式,並簡化與隱私權保護 API 的整合作業。

  1. Maven 存放區新增至您的專案。
  2. 在應用程式或模組的 build.gradle 檔案中,宣告 ads-adservices Jetpack 程式庫依附元件
  3. 使用來自 androidx.privacysandbox.ads.adservices.* 套件的 API。
  4. ads-adservices Jetpack 程式庫內建 Kotlin 協同程式支援機制。您可能需要在專案中整合適當的生命週期感知依附元件,管理協同程式範圍。

檢查 Ad Services Extensions 版本的可用性

如果您使用 ads-services Jetpack 程式庫來整合隱私權保護 API,則程式庫會檢查 obtain() 函式中要求的 API 是否可用。如果無法在裝置上取得要求的 API,此函式會傳回空值。以下範例說明如何初始化 Topics API 的 TopicsManager。運作方式類似存取其他隱私權保護 API。

Kotlin

import androidx.privacysandbox.ads.adservices.topics.TopicsManager

// The initialization function will return null if the requested
// functionality is not available on the device.
val topicsManager = TopicsManager.obtain(context)

Java

import androidx.privacysandbox.ads.adservices.topics.TopicsManager;

// The initialization function will return null if the requested
// functionality is not available on the device.
TopicsManager topicsManager = TopicsManager.obtain(context);

如果您在 Extension SDK 中直接使用 AdServices API,請查看包含所需 AdServices API 的 AdServices Extensions 版本。您可以在 API 參考資料中,找到特定 AdServices API 引入的版本。舉例來說,TopicsManager 類別的 API 參考資料會註明「Ad Services Extensions 4 的新功能」。請運用下列條件式檢查作業,驗證包含 AdServices API 的 SDK 擴充功能。

Kotlin

import android.os.ext.SdkExtensions

if (SDK_INT >= Build.VERSION_CODES.R && // The extensions API is available since R.
   SdkExtensions.getExtensionVersion(SdkExtensions.AD_SERVICES) >= 4) {

    // AdServices API is available.
...
}

Java

import android.os.ext.SdkExtensions;

if (SDK_INT >= Build.VERSION_CODES.R && // The extensions API is available since R.
   SdkExtensions.getExtensionVersion(SdkExtensions.AD_SERVICES) >= 4) {

    // AdServices API is available.
...
}

前景存取權限制

為提供資訊透明度,SDK 執行階段和隱私權保護 API 僅開放給具有可見 Activity (或 IMPORTANCE_FOREGROUND 設為 RunningAppProcessInfo) 的應用程式使用。