Yêu cầu sự đồng ý của người dùng ở Châu Âu

Theo Chính sách của Google về sự đồng ý của người dùng ở Liên minh Châu Âu, bạn phải tiết lộ một số thông tin nhất định cho những người dùng ở Khu vực kinh tế Châu Âu (EEA) và phải có được sự đồng ý của những người dùng đó để sử dụng cookie hoặc phương pháp lưu trữ cục bộ khác (trong trường hợp pháp luật yêu cầu), cũng như để sử dụng dữ liệu cá nhân (chẳng hạn như mã nhận dạng cho quảng cáo) nhằm mục đích phân phát quảng cáo. Chính sách này thể hiện các yêu cầu của Chỉ thị về quyền riêng tư và truyền thông điện tử của Liên minh Châu Âu và Quy định chung về bảo vệ dữ liệu (GDPR).

Để giúp các nhà xuất bản tuân thủ các nghĩa vụ của họ theo chính sách này, Google cung cấp SDK lấy sự đồng ý. SDK lấy sự đồng ý là một thư viện nguồn mở cung cấp các hàm hữu dụng để lấy sự đồng ý của người dùng. Bạn có thể tìm thấy toàn bộ mã nguồn trên GitHub.

Những quảng cáo do Google phân phát có thể được phân loại là quảng cáo được cá nhân hóa hoặc không được cá nhân hóa, cả hai loại quảng cáo này đều yêu cầu phải có sự đồng ý của người dùng ở Khu vực kinh tế Châu Âu (EEA). Theo mặc định, yêu cầu quảng cáo gửi đến Google sẽ phân phát quảng cáo được cá nhân hóa, trong đó quảng cáo được chọn dựa trên dữ liệu đã thu thập trước đây của người dùng. Google cũng hỗ trợ việc định cấu hình các yêu cầu quảng cáo để phân phát quảng cáo không được cá nhân hóa. Tìm hiểu thêm về quảng cáo được cá nhân hóa và không được cá nhân hóa.

Hướng dẫn này mô tả cách sử dụng SDK lấy sự đồng ý để có được sự đồng ý của người dùng. Ngoài ra, hướng dẫn này cũng mô tả cách chuyển tiếp sự đồng ý đến SDK quảng cáo trên thiết bị di động của Google sau khi bạn đã lấy được sự đồng ý.

Điều kiện tiên quyết

Các ứng dụng có thể nhập SDK lấy sự đồng ý bằng cách sử dụng phần phụ thuộc Gradle trỏ đến kho lưu trữ Maven của Google. Để sử dụng kho lưu trữ đó, bạn cần tham chiếu kho lưu trữ đó trong tệp build.gradle ở cấp dự án của ứng dụng. Hãy mở tệp của bạn và tìm mục allprojects:

Ví dụ về tệp build.gradle cấp dự án (phần trích dẫn)

allprojects {
    repositories {
        google()
        jcenter()
    }
}

Thêm lệnh google() ở trên nếu chưa có.

Tiếp theo, hãy mở tệp build.gradle ở cấp ứng dụng cho ứng dụng của bạn và tìm mục "phần phụ thuộc".

Ví dụ về tệp build.gradle cấp ứng dụng (phần trích dẫn)

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.android.ads.consent:consent-library:1.0.6'
}

Thêm dòng in đậm ở trên để hướng dẫn Gradle tải phiên bản mới nhất của SDK lấy sự đồng ý. Sau khi thực hiện xong, hãy lưu tệp và tiến hành đồng bộ hóa với Gradle.

Trước khi sử dụng phương thức nào khác trong SDK lấy sự đồng ý, bạn nên cập nhật trạng thái đồng ý để đảm bảo rằng SDK lấy sự đồng ý có thông tin mới nhất về các nhà cung cấp công nghệ quảng cáo mà bạn đã chọn trong giao diện người dùngAdMob. Nếu danh sách các nhà cung cấp công nghệ quảng cáo đã thay đổi so với lần gần đây nhất người dùng đồng ý, thì trạng thái đồng ý sẽ được đặt lại về trạng thái không xác định.

Trường hợp bạn không sử dụng tính năng dàn xếp

Nếu không sử dụng tính năng dàn xếp, bạn có 2 tùy chọn để triển khai SDK lấy sự đồng ý.

Tùy chọn 1: sử dụng SDK lấy sự đồng ý để trình bày biểu mẫu lấy sự đồng ý do Google hiển thị cho người dùng của bạn. Biểu mẫu lấy sự đồng ý hiển thị một danh sách gồm các nhà cung cấp công nghệ quảng cáo mà bạn đã chọn trong giao diện người dùng AdMob. SDK lấy sự đồng ý lưu trữ thông tin phản hồi về lựa chọn của người dùng.

Tùy chọn 2: sử dụng SDK lấy sự đồng ý để chủ động truy xuất toàn bộ danh sách các nhà cung cấp công nghệ quảng cáo từ AdMob, như đã giải thích trong bài viết lấy sự đồng ý do nhà xuất bản quản lý. Tuy nhiên, trong trường hợp này, bạn sẽ cần xác định cách tạo danh sách các nhà cung cấp cho người dùng cũng như trình bày biểu mẫu lấy sự đồng ý của riêng bạn cho người dùng.

Sau khi người dùng đã lựa chọn đồng ý, bạn có thể yêu cầu SDK lấy sự đồng ý lưu trữ lựa chọn đồng ý của người dùng như đã giải thích trong Lưu trữ dữ liệu về sự đồng ý do nhà xuất bản quản lý.

Sau khi lấy sự đồng ý, nếu người dùng đã đồng ý chỉ nhận quảng cáo không được cá nhân hóa, bạn sẽ cần chuyển tiếp sự đồng ý đến SDK quảng cáo trên thiết bị di động của Google.

Trường hợp bạn sử dụng tính năng dàn xếp AdMob

Bạn có thể sử dụng SDK lấy sự đồng ý để chủ động truy xuất toàn bộ danh sách nhà cung cấp công nghệ quảng cáo từ AdMob, như đã giải thích trong bài viết lấy sự đồng ý do nhà xuất bản quản lý. Bạn sẽ phải xác định xem bạn cần hiển thị thêm các nhà cung cấp công nghệ quảng cáo nào từ các mạng quảng cáo khác cho người dùng để lấy sự đồng ý.

Là một nhà phát triển ứng dụng, bạn sẽ cần lấy sự đồng ý của người dùng cho cả nhà cung cấp công nghệ quảng cáo do SDK lấy sự đồng ý trả về và nhà cung cấp từ các mạng quảng cáo khác. Bạn cũng cần lưu trữ theo cách thủ công các lựa chọn của người dùng và chuyển tiếp sự đồng ý đến SDK quảng cáo trên thiết bị di động của Google nếu người dùng đã đồng ý chỉ nhận quảng cáo không được cá nhân hóa.

Hiện tại, Google không thể lấy và xử lý sự đồng ý cho các mạng dàn xếp, vì vậy, bạn sẽ cần lấy và xử lý riêng sự đồng ý cho từng mạng quảng cáo. Chúng tôi đang tích cực làm việc với tất cả mạng dàn xếp nguồn mở với các phiên bản khác nhau để cung cấp tài liệu cập nhật kèm theo thông tin chi tiết về cách chuyển tiếp sự đồng ý. Tài liệu đã được phát hành cho các mạng dàn xếp sau đây:

Cập nhật trạng thái đồng ý

Khi sử dụng SDK lấy sự đồng ý, bạn nên xác định trạng thái về sự đồng ý của người dùng vào mỗi lần khởi chạy ứng dụng. Để thực hiện việc này, hãy gọi requestConsentInfoUpdate() trên bản sao của ConsentInformation.

import com.google.ads.consent.*;

public class MainActivity extends Activity {
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        ConsentInformation consentInformation = ConsentInformation.getInstance(context);
        String[] publisherIds = {"pub-0123456789012345"};
        consentInformation.requestConsentInfoUpdate(publisherIds, new ConsentInfoUpdateListener() {
            @Override
            public void onConsentInfoUpdated(ConsentStatus consentStatus) {
                 // User's consent status successfully updated.
            }

            @Override
            public void onFailedToUpdateConsentInfo(String errorDescription) {
                 // User's consent status failed to update.
            }
        });
        ...
    }
    ...
}

Lệnh gọi đến requestConsentInfoUpdate() yêu cầu 2 đối số:

  • Một loạt mã nhà xuất bản hợp lệ và được kích hoạt hoàn toàn mà từ đó ứng dụng của bạn yêu cầu quảng cáo. Tìm mã nhà xuất bản.

  • Một bản sao của ConsentInfoUpdateListener.

Nếu thông tin về sự đồng ý được cập nhật thành công, phương thức onConsentInfoUpdated() của ConsentInfoUpdateListener sẽ cung cấp trạng thái đồng ý đã cập nhật. ConsentStatus được trả lại có thể có các giá trị sau:

Trạng thái đồng ý Định nghĩa
ConsentStatus.PERSONALIZED Người dùng đã đồng ý nhận quảng cáo được cá nhân hóa.
ConsentStatus.NON_PERSONALIZED Người dùng đã đồng ý nhận quảng cáo không được cá nhân hóa.
ConsentStatus.UNKNOWN Người dùng không đồng ý cũng không từ chối nhận quảng cáo được cá nhân hóa hoặc quảng cáo không được cá nhân hóa.

Khi thông tin về sự đồng ý được cập nhật thành công, bạn cũng có thể kiểm tra ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown() để xem người dùng có ở Khu vực kinh tế Châu Âu hay không hay hệ thống không thể xác định vị trí yêu cầu.

Nếu phương thức isRequestLocationInEeaOrUnknown() trả về false, thì tức là người dùng đó không ở khu vực kinh tế Châu Âu và bạn không phải lấy sự đồng ý của người dùng đó theo Chính sách về sự đồng ý của người dùng ở Liên minh Châu Âu. Bạn có thể tạo các yêu cầu quảng cáo cho SDK quảng cáo trên thiết bị di động của Google.

Nếu phương thức isRequestLocationInEeaOrUnknown() trả về true:

SDK lấy sự đồng ý của Google. cho phép bạn lấy sự đồng ý của người dùng thông qua 2 cách:

Hãy nhớ cung cấp cho người dùng tùy chọn Thay đổi hoặc thu hồi sự đồng ý.

Biểu mẫu lấy sự đồng ý do Google hiển thị là một biểu mẫu định cấu hình toàn màn hình hiển thị trên nội dung ứng dụng của bạn. Bạn có thể định cấu hình biểu mẫu để trình bày cho người dùng các kiểu kết hợp theo các tùy chọn sau:

  • Đồng ý xem quảng cáo được cá nhân hóa
  • Đồng ý xem quảng cáo không được cá nhân hóa
  • Sử dụng phiên bản có trả tiền của ứng dụng thay vì xem quảng cáo

Bạn nên xem xét kỹ văn bản lấy sự đồng ý: theo mặc định, văn bản này là một thông báo có thể phù hợp nếu bạn sử dụng Google để kiếm tiền từ ứng dụng; nhưng chúng tôi không thể cung cấp dịch vụ tư vấn pháp lý về văn bản đồng ý thích hợp cho bạn. Để cập nhật văn bản trên biểu mẫu lấy sự đồng ý của Google, hãy sửa đổi tệp consentform.html trong SDK lấy sự đồng ý theo yêu cầu.

Biểu mẫu lấy sự đồng ý do Google hiển thị được định cấu hình và hiển thị thông qua lớp ConsentForm. Đoạn mã sau minh họa cách tạo ConsentForm với cả 3 tùy chọn lấy sự đồng ý:

URL privacyUrl = null;
try {
    // TODO: Replace with your app's privacy policy URL.
    privacyUrl = new URL("https://www.your.com/privacyurl");
} catch (MalformedURLException e) {
    e.printStackTrace();
    // Handle error.
}
ConsentForm form = new ConsentForm.Builder(context, privacyUrl)
    .withListener(new ConsentFormListener() {
        @Override
        public void onConsentFormLoaded() {
            // Consent form loaded successfully.
        }

        @Override
        public void onConsentFormOpened() {
            // Consent form was displayed.
        }

        @Override
        public void onConsentFormClosed(
                ConsentStatus consentStatus, Boolean userPrefersAdFree) {
            // Consent form was closed.
        }

        @Override
        public void onConsentFormError(String errorDescription) {
            // Consent form error.
        }
    })
    .withPersonalizedAdsOption()
    .withNonPersonalizedAdsOption()
    .withAdFreeOption()
    .build();

Các phương thức ở trên chuẩn bị biểu mẫu lấy sự đồng ý do Google hiển thị với các tùy chọn sau:

withListener()
Đăng ký trình xử lý cho ConsentForm. Mỗi phương thức có thể ghi đè trong ConsentFormListener tương ứng với một sự kiện trong thời gian hoạt động của biểu mẫu lấy sự đồng ý.
Các phương thức có thể ghi đè
onConsentFormLoaded Đã tải thành công biểu mẫu lấy sự đồng ý.
onConsentFormError Không thể tải biểu mẫu lấy sự đồng ý. Thông số errorDescription cung cấp thông tin mô tả về lỗi.
onConsentFormOpened Đã mở biểu mẫu lấy sự đồng ý.
onConsentFormClosed Đã đóng biểu mẫu lấy sự đồng ý. Các thông số của phương thức cung cấp thông tin sau:
  • consentStatus là giá trị ConsentStatus mô tả trạng thái đồng ý mới nhất của người dùng.
  • userPrefersAdFree có giá trị true khi người dùng chọn sử dụng phiên bản có trả tiền của ứng dụng thay vì xem quảng cáo.
withPersonalizedAdsOption()
Cho biết rằng biểu mẫu lấy sự đồng ý sẽ hiển thị một tùy chọn quảng cáo được cá nhân hóa.
withNonPersonalizedAdsOption()
Cho biết rằng biểu mẫu lấy sự đồng ý sẽ hiển thị một tùy chọn quảng cáo không được cá nhân hóa.
withAdFreeOption()
Cho biết rằng biểu mẫu lấy đồng ý sẽ hiển thị một tùy chọn ứng dụng không có quảng cáo.

Khi bạn đã tạo một đối tượng ConsentForm, hãy tải biểu mẫu lấy sự đồng ý bằng cách gọi phương thức load() của ConsentForm (như được hiển thị bên dưới):

form.load();

Để người dùng nhìn thấy biểu mẫu lấy sự đồng ý do Google hiển thị, hãy gọi show() trên một phiên bản của ConsentForm (như minh họa bên dưới):

form.show();

Sau khi người dùng chọn một tùy chọn và đóng biểu mẫu, SDK lấy sự đồng ý sẽ lưu lựa chọn của người dùng và kích hoạt sự kiện onConsentFormClosed. Bạn có thể xử lý sự kiện này và chuyển tiếp sự đồng ý đến SDK quảng cáo trên thiết bị di động của Google .

Lấy sự đồng ý do nhà xuất bản quản lý

Nếu muốn tự mình lấy sự đồng ý của người dùng, bạn có thể sử dụng phương thức getAdProviders() của lớp ConsentInformation để yêu cầu nhà cung cấp công nghệ quảng cáo liên kết với Mã nhà xuất bản được sử dụng trong ứng dụng của bạn. Xin lưu ý rằng cần có sự đồng ý để có danh sách đầy đủ các nhà cung cấp công nghệ quảng cáo được định cấu hình cho Mã nhà xuất bản của bạn.

Trước khi gọi getAdProviders(), bạn phải đợi phương thức onConsentInfoUpdate() của ConsentInfoUpdateListener (như được mô tả trong mục Cập nhật trạng thái đồng ý).

List<AdProvider> adProviders =
    ConsentInformation.getInstance(context).getAdProviders();

Sau đó, bạn có thể sử dụng danh sách các nhà cung cấp công nghệ quảng cáo để tự lấy sự đồng ý.

Khi nhận được sự đồng ý, hãy ghi lại ConsentStatus tương ứng với câu trả lời của người dùng bằng cách sử dụng phương thức setConsentStatus() của lớp ConsentInformation.

ConsentInformation.getInstance(context)
    .setConsentStatus(ConsentStatus.PERSONALIZED);

Sau khi báo cáo sự đồng ý với SDK lấy sự đồng ý, bạn có thể chuyển tiếp sự đồng ý đến SDK quảng cáo trên thiết bị di động của Google.

Để cho phép người dùng cập nhật sự đồng ý của họ, bạn chỉ cần lặp lại các bước trong mục Lấy sự đồng ý khi người dùng chọn cập nhật trạng thái đồng ý của họ.

Nếu nhà xuất bản biết rằng người dùng chưa đủ tuổi thành niên, tất cả các yêu cầu quảng cáo đều phải đặt TFUA (Thẻ cho người dùng chưa đủ tuổi thành niên ở Châu Âu). Để đưa thẻ này vào tất cả các yêu cầu quảng cáo được tạo từ ứng dụng của bạn, hãy gọi setTagForUnderAgeOfConsent(true). Tùy chọn cài đặt này có hiệu lực cho tất cả các yêu cầu quảng cáo trong tương lai.

ConsentInformation.getInstance(context).setTagForUnderAgeOfConsent(true);

Sau khi bật tùy chọn cài đặt TFUA, bạn sẽ không thể tải biểu mẫu lấy sự đồng ý do Google hiển thị. Tất cả yêu cầu quảng cáo bao gồm TFUA sẽ trở thành không đủ điều kiện cho hoạt động tiếp thị lại và quảng cáo được cá nhân hóa. TFUA vô hiệu hóa yêu cầu cho nhà cung cấp công nghệ quảng cáo bên thứ ba, chẳng hạn như pixel đo lường quảng cáo và máy chủ quảng cáo bên thứ ba.

Để xóa TFUA khỏi các yêu cầu quảng cáo, hãy gọi setTagForUnderAgeOfConsent(false).

Thử nghiệm

SDK lấy sự đồng ý có các hành động khác nhau tùy thuộc vào giá trị của ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown(). Ví dụ: không thể tải biểu mẫu lấy sự đồng ý nếu người dùng không ở Khu vực kinh tế Châu Âu (EEA).

Để cho phép thử nghiệm ứng dụng của bạn dễ dàng hơn cả bên trong và bên ngoài Khu vực kinh tế Châu Âu (EEA), SDK lấy sự đồng ý hỗ trợ các tùy chọn gỡ lỗi mà bạn có thể đặt trước khi gọi bất kỳ phương thức nào khác trong SDK lấy sự đồng ý.

  1. Hãy làm theo hướng dẫn trong mục cập nhật trạng thái đồng ý để gọi requestConsentInfoUpdate. Sau đó, hãy chạy ứng dụng của bạn. Kiểm tra đầu ra logcat cho nhật ký sau đây:

    I/ConsentInformation: Use
    ConsentInformation.getInstance(context).addTestDevice("33BE2250B43518CCDA7DE426D04EE231")
    to get test ads on this device.
  2. Chỉ định thiết bị của bạn làm thiết bị thử nghiệm bằng cách sử dụng mã nhận dạng cho quảng cáo từ logcat:

    ConsentInformation.getInstance(context).addTestDevice("33BE2250B43518CCDA7DE426D04EE231");
  3. Cuối cùng, hãy gọi setDebugGeography để đặt vị trí địa lý mà bạn muốn thử nghiệm.

    // Geography appears as in EEA for test devices.
    ConsentInformation.getInstance(context).
        setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_EEA);
    // Geography appears as not in EEA for debug devices.
    ConsentInformation.getInstance(context).
        setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_NOT_EEA);

Sau khi hoàn thành các bước này, các lệnh gọi để cập nhật trạng thái đồng ý sẽ tính đến vị trí địa lý gỡ lỗi của bạn.

Bạn có thể sử dụng mã trong mục này với mọi phiên bản SDK quảng cáo trên thiết bị di động của Google. Bạn cũng có thể sử dụng mã cho dù bạn có sử dụng SDK lấy sự đồng ý để lấy sự đồng ý hay không.

Hoạt động mặc định của SDK quảng cáo trên thiết bị di động của Google là phân phát quảng cáo được cá nhân hóa. Nếu người dùng đã đồng ý chỉ nhận quảng cáo không được cá nhân hóa, bạn có thể định cấu hình đối tượng AdRequest để chỉ định rằng chỉ có quảng cáo không được cá nhân hóa mới được yêu cầu: Quảng cáo không được cá nhân hóa luôn được người dùng yêu cầu thông qua mã sau, bất kể người dùng có ở Khu vực kinh tế Châu Âu (EEA) hay không:

Bundle extras = new Bundle();
extras.putString("npa", "1");

AdRequest request = new AdRequest.Builder()
        .addNetworkExtrasBundle(AdMobAdapter.class, extras)
        .build();

Nếu có yêu cầu quảng cáo không được cá nhân hóa, thì URL yêu cầu quảng cáo hiện tại sẽ chứa &npa=1. Tuy nhiên, xin lưu ý rằng đây là thông tin chi tiết về hoạt động triển khai nội bộ của SDK quảng cáo trên thiết bị di động của Google và có thể thay đổi.

Trì hoãn đo lường ứng dụng (không bắt buộc)

Theo mặc định, SDK quảng cáo trên thiết bị di động của Google khởi chạy giải pháp đo lường ứng dụng và bắt đầu gửi dữ liệu sự kiện cấp người dùng tới Google ngay khi ứng dụng khởi động. Hoạt động khởi chạy này đảm bảo rằng bạn có thể kích hoạt các chỉ số người dùng AdMob mà không cần thực hiện thêm thay đổi nào về mã.

Tuy nhiên, nếu ứng dụng của bạn cần có sự đồng ý của người dùng trước khi gửi những sự kiện này, thì bạn có thể trì hoãn việc đo lường ứng dụng cho đến khi chắc chắn khởi chạy SDK quảng cáo trên thiết bị di động hoặc tải quảng cáo.

Để trì hoãn việc đo lường ứng dụng, hãy thêm thẻ <meta-data> sau vào AndroidManifest.xml.

<manifest>
     <application>
        <!-- Delay app measurement until MobileAds.initialize() is called. -->
        <meta-data
            android:name="com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT"
            android:value="true"/>
    </application>
</manifest>

Câu hỏi thường gặp

SDK lấy sự đồng ý hỗ trợ bao nhiêu nhà cung cấp công nghệ quảng cáo?
SDK lấy sự đồng ý không quy định hạn mức về số lượng nhà cung cấp công nghệ quảng cáo mà nhà xuất bản có thể chọn kích hoạt.
Danh sách nhà cung cấp công nghệ quảng cáo được SDK trả lại có tự động cập nhật không nếu tôi thay đổi lựa chọn của mình trong giao diện người dùng AdMob?
Có, nếu bạn thay đổi danh sách các nhà cung cấp công nghệ quảng cáo trong giao diện người dùng AdMob, các thay đổi đó sẽ truyền đến các máy chủ quảng cáo của Google trong khoảng một giờ.