Nhận mã nhận dạng cho quảng cáo mà người dùng có thể đặt lại Một phần của Android Jetpack.

Để bảo vệ quyền riêng tư của người dùng, tất cả ứng dụng Android đều nên sử dụng các giá trị nhận dạng mà người dùng đặt lại được. Một giá trị nhận dạng như vậy là mã nhận dạng cho quảng cáo, dùng để nhận dạng riêng biệt một người dùng cụ thể cho các trường hợp sử dụng quảng cáo, chẳng hạn như cá nhân hoá quảng cáo.

Để hỗ trợ một giải pháp theo dõi quảng cáo được chuẩn hoá trên các thiết bị chạy ứng dụng của bạn, bạn có thể sử dụng thư viện Mã nhận dạng cho quảng cáo. Thư viện này có trên các thiết bị chạy Android 4.0 (API cấp 14) trở lên, xác định một giao diện để tương tác với nhà cung cấp quảng cáo ở cấp độ hệ thống. Giao diện này cho phép ứng dụng của bạn nhận được các giá trị mã nhận dạng nhất quán cho quảng cáo.

Nhà cung cấp quảng cáo có trong thư viện Mã nhận dạng cho quảng cáo cũng xác định một ý định tiêu chuẩn để mở màn hình cài đặt mà nhà cung cấp quảng cáo triển khai. Màn hình cài đặt này cho phép người dùng đặt lại mã nhận dạng cho quảng cáo và chọn không sử dụng tính năng cá nhân hoá quảng cáo.

Hướng dẫn này giải thích cách sử dụng mô-đun ứng dụng của thư viện Mã nhận dạng cho quảng cáo để nhận được mã nhận dạng nhất quán cho quảng cáo trên cơ sở mỗi người dùng thiết bị. Sau đó, hướng dẫn này trình bày thông tin tổng quan về cấu trúc của thư viện.

Định cấu hình ứng dụng khách

Bằng cách tương tác với mô-đun ứng dụng của thư viện Mã nhận dạng cho quảng cáo, ứng dụng của bạn có thể truy xuất một mã nhận dạng nhất quán cho quảng cáo, mã này đại diện cho người dùng đang tương tác với ứng dụng.

Mã nhận dạng cho quảng cáo được biểu thị bằng phiên bản 3 của định dạng mã nhận dạng duy nhất trên toàn cầu (UUID) hoặc định dạng tương đương 128 bit:

38400000-8cf0-11bd-b23e-10b96e40000d

Thư viện Mã nhận dạng cho quảng cáo chuẩn hoá giá trị trả về khi cần thiết để cung cấp mã nhận dạng bằng định dạng này.

Để truy xuất mã nhận dạng cho quảng cáo mà người dùng có thể đặt lại cho ứng dụng của bạn, hãy hoàn tất các bước sau:

  1. Kiểm tra xem có nhà cung cấp quảng cáo nào không bằng cách gọi AdvertisingIdClient.isAdvertisingIdProviderAvailable(). Nếu phương thức này trả về false, thì ứng dụng của bạn phải sử dụng một phương thức khác để thực hiện mọi trường hợp sử dụng cần thiết cho hoạt động theo dõi quảng cáo.

  2. Lấy thông tin chi tiết về giá trị nhận dạng quảng cáo, bao gồm cả mã nhận dạng cho quảng cáo, bằng cách gọi AdvertisingIdClient.getAdvertisingIdInfo(). Thư viện Mã nhận dạng cho quảng cáo thực thi phương thức này trên một luồng worker và sử dụng thời gian chờ kết nối là 10 giây.

Đoạn mã sau đây minh hoạ cách truy xuất mã nhận dạng cho quảng cáo cùng với các thông tin khác từ nhà cung cấp quảng cáo:

app/build.gradle

Groovy

dependencies {
    implementation 'androidx.ads:ads-identifier:1.0.0-alpha01'

    // Used for the calls to addCallback() in the snippets on this page.
    implementation 'com.google.guava:guava:28.0-android'
}

Kotlin

dependencies {
    implementation("androidx.ads:ads-identifier:1.0.0-alpha01")

    // Used for the calls to addCallback() in the snippets on this page.
    implementation("com.google.guava:guava:28.0-android")
}

MyAdIdClient

Kotlin

// Used for the call to addCallback() within this snippet.
import com.google.common.util.concurrent.Futures.addCallback

private fun determineAdvertisingInfo() {
    if (AdvertisingIdClient.isAdvertisingIdProviderAvailable()) {
        val advertisingIdInfoListenableFuture =
                AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)

        addCallback(advertisingIdInfoListenableFuture,
                object : FutureCallback<AdvertisingIdInfo> {
            override fun onSuccess(adInfo: AdvertisingIdInfo?) {
                val id: String = adInfo?.id
                val providerPackageName: String = adInfo?.providerPackageName
                val isLimitTrackingEnabled: Boolean =
                                adInfo?.isLimitTrackingEnabled
            }

            // Any exceptions thrown by getAdvertisingIdInfo()
            // cause this method to be called.
            override fun onFailure(t: Throwable) {
                Log.e("MY_APP_TAG",
                        "Failed to connect to Advertising ID provider.")
                // Try to connect to the Advertising ID provider again or fall
                // back to an ad solution that doesn't require using the
                // Advertising ID library.
            }
        }, Executors.newSingleThreadExecutor())
    } else {
        // The Advertising ID client library is unavailable. Use a different
        // library to perform any required ad use cases.
    }
}

Java

// Used for the call to addCallback() within this snippet.
import com.google.common.util.concurrent.Futures;

private void determineAdvertisingInfo() {
    if (AdvertisingIdClient.isAdvertisingIdProviderAvailable()) {
        ListenableFuture<AdvertisingIdInfo> advertisingIdInfoListenableFuture =
                AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext());
        Futures.addCallback(advertisingIdInfoListenableFuture,
                new FutureCallback<AdvertisingIdInfo>() {
                    @Override
                    public void onSuccess(AdvertisingIdInfo adInfo) {
                        String id = adInfo.getId();
                        String providerPackageName =
                                adInfo.getProviderPackageName();
                        boolean isLimitTrackingEnabled =
                                adInfo.isLimitTrackingEnabled();

                    // Any exceptions thrown by getAdvertisingIdInfo()
                    // cause this method to be called.
                    @Override
                    public void onFailure(Throwable throwable) {
                        Log.e("MY_APP_TAG",
                                "Failed to connect to Advertising ID provider.");
                        // Try to connect to the Advertising ID provider again
                        // or fall back to an ad solution that doesn't require
                        // using the Advertising ID library.
                    }
                });
    } else {
        // The Advertising ID client library is unavailable. Use a different
        // library to perform any required ad use cases.
    }
}

Cấu trúc thư viện mã nhận dạng cho quảng cáo

Cấu trúc thư viện mã nhận dạng cho quảng cáo.
Hình 1. Cấu trúc thư viện mã nhận dạng cho quảng cáo

Hình 1 mô tả cấu trúc của thư viện Mã nhận dạng cho quảng cáo. Thư viện này bao gồm các mô-đun sau:

  • Một mô-đun ứng dụng, là một lớp mỏng có trong các ứng dụng.
  • Một mô-đun nhà cung cấp do nhà sản xuất thiết bị cung cấp. Việc triển khai mô-đun này phải xác định giao diện người dùng cài đặt để cho phép người dùng đặt lại mã nhận dạng cho quảng cáo và bật/tắt các lựa chọn ưu tiên theo dõi quảng cáo.

Mô-đun ứng dụng sẽ giao tiếp với mô-đun nhà cung cấp để truy xuất mã nhận dạng cho quảng cáo và lựa chọn ưu tiên của người dùng về hoạt động theo dõi quảng cáo.

Cách thư viện xử lý nhiều nhà cung cấp

Một thiết bị có thể hỗ trợ nhiều nhà cung cấp quảng cáo ở cấp hệ thống cùng một lúc. Nếu phát hiện thấy tình huống này, thư viện Mã nhận dạng cho quảng cáo sẽ xác minh rằng ứng dụng của bạn luôn truy xuất thông tin từ cùng một nhà cung cấp, giả sử nhà cung cấp đó vẫn hoạt động. Quá trình này giúp duy trì tính nhất quán của mã nhận dạng cho quảng cáo.

Nếu tập hợp các nhà cung cấp quảng cáo hiện có thay đổi theo thời gian và ứng dụng của bạn tương tác với một nhà cung cấp giá trị nhận dạng quảng cáo khác, thì tất cả các ứng dụng khách khác cũng sẽ bắt đầu sử dụng nhà cung cấp mới đó. Ứng dụng của bạn thể hiện hành vi tương tự như hành vi sẽ xảy ra nếu người dùng yêu cầu đặt lại mã nhận dạng cho quảng cáo.

Thư viện nhà cung cấp Mã nhận dạng cho quảng cáo sử dụng thứ tự xác định sau đây để xếp hạng các nhà cung cấp:

  1. Những nhà cung cấp đã yêu cầu quyền androidx.ads.identifier.provider.HIGH_PRIORITY.
  2. Những nhà cung cấp đã được cài đặt trên thiết bị trong thời gian dài nhất.
  3. Nhà cung cấp xuất hiện đầu tiên theo thứ tự bảng chữ cái.