Konfiguracja
Aby zaimplementować interfejs Topics API, musisz najpierw skonfigurować środowisko programistyczne. Aby to zrobić, wykonaj te czynności:
Użyj najnowszej wersji pakietu SDK Piaskownicy prywatności na Androida, aby uzyskać najnowszą wersję interfejsów API zapewniających ochronę prywatności.
Dodaj do pliku manifestu:
Uprawnienia: dodaj uprawnienie
ACCESS_ADSERVICES_TOPICS
, aby umożliwić aplikacji dostęp do interfejsu Topics API:<uses-permission android:name="android.permission.ACCESS_ADSERVICES_TOPICS" />
Konfiguracja usług reklamowych: w pliku manifestu w elemencie
<application>
odwołuj się do pliku konfiguracji usług reklamowych.<property android:name="android.adservices.AD_SERVICES_CONFIG" android:resource="@xml/ad_services_config" />
Wskazać zasób XML Usług reklamowych, na który wskazuje manifest, np.
res/xml/ad_services_config.xml
. Użyj atrybutuallowAllToAccess
, aby przyznać dostęp do wszystkich pakietów SDK, lub atrybutuallowSdksToAccess
, aby przyznać dostęp do poszczególnych pakietów SDK. Dowiedz się więcej o uprawnieniach usług reklamowych i kontroli dostępu do pakietu SDK.<ad-services-config> <topics allowAllToAccess="true"/> </ad-services-config>
Zarejestruj swoją technologię reklamową w Piaskownicy prywatności, aby wywoływać interfejs Topics API w swoim pakiecie SDK. Aby przeprowadzić testowanie lokalnie, możesz wyłączyć sprawdzanie rejestracji w programie Topics za pomocą tych poleceń:
adb shell setprop debug.adservices.disable_topics_enrollment_check true
Włącz dostęp do interfejsu Topics API. Domyślnie interfejs Topics API jest wyłączony. Musisz go włączyć za pomocą poleceń ADB:
adb shell device_config put adservices ppapi_app_signature_allow_list \"\*\"
adb shell setprop debug.adservices.disable_topics_enrollment_check true
Rozpocznij implementację, tworząc wersję przykładowej aplikacji w języku Java lub Kotlin, aby zapoznać się z metodami pobierania tematów na urządzeniu.
Prośba o zestaw tematów
Podstawowa funkcjonalność interfejsu Topics API znajduje się w metodie getTopics()
w obiekcie TopicsManager
, jak w tym przykładzie:
Kotlin
fun getTopics(
getTopicsRequest: GetTopicsRequest,
executor: Executor,
callback: OutcomeReceiver<GetTopicsResponse, Exception>
) { }
Java
public void getTopics (@NonNull GetTopicsRequest getTopicsRequest,
@NonNull Executor executor,
@NonNull OutcomeReceiver<GetTopicsResponse, Exception> callback)
Aby użyć tej metody, zainicjuj obiekt TopicsManager
i parametry potrzebne do odbierania danych tematów. GetTopicsRequest
przekazuje potrzebne informacje do pobrania danych z interfejsu Topics API, w tym flagę wskazującą, czy wywołujący ma działać jako obserwator. Jeśli nie działasz jako obserwator, wywołanie getTopics
zwraca temat z poprzedniej epoki, ale nie wpływa na dane dotyczące tematów w następnej epoce. Wywołanie OutcomeReceiver
asynchronicznie obsługuje wynik. Na przykład:
Kotlin
private fun topicGetter() {
val mContext = baseContext
val mTopicsManager = mContext.getSystemService(TopicsManager::class.java)
val mExecutor: Executor = Executors.newCachedThreadPool()
val shouldRecordObservation = false
val mTopicsRequestBuilder: GetTopicsRequest.Builder = GetTopicsRequest.Builder()
mTopicsRequestBuilder.setAdsSdkName(baseContext.packageName)
mTopicsRequestBuilder.setShouldRecordObservation(shouldRecordObservation)
mTopicsManager.getTopics(mTopicsRequestBuilder.build(), mExecutor,
mCallback as OutcomeReceiver<GetTopicsResponse, Exception>)
}
private var mCallback: OutcomeReceiver<GetTopicsResponse, java.lang.Exception> =
object : OutcomeReceiver<GetTopicsResponse, java.lang.Exception> {
override fun onResult(result: GetTopicsResponse) {
// handle successful result
val topicsResult = result.topics
for (i in topicsResult.indices) {
Log.i("Topic", topicsResult[i].getTopicId().toString())
}
if (topicsResult.size == 0) {
Log.i("Topic", "Returned Empty")
}
}
override fun onError(error: java.lang.Exception) {
// handle error
Log.i("Topic", "Error, did not return successfully")
}
}
Java
public void TopicGetter() {
@NonNull Context mContext = getBaseContext();
TopicsManager mTopicsManager = mContext.getSystemService(TopicsManager.class);
Executor mExecutor = Executors.newCachedThreadPool();
boolean shouldRecordObservation = false;
GetTopicsRequest.Builder mTopicsRequestBuilder = new GetTopicsRequest.Builder();
mTopicsRequestBuilder.setAdsSdkName(getBaseContext().getPackageName());
mTopicsRequestBuilder.setShouldRecordObservation(shouldRecordObservation);
mTopicsManager.getTopics(mTopicsRequestBuilder.build(), mExecutor, mCallback);
}
OutcomeReceiver mCallback = new OutcomeReceiver<GetTopicsResponse, Exception>() {
@Override
public void onResult(@NonNull GetTopicsResponse result) {
//Handle Successful Result
List<Topic> topicsResult = result.getTopics();
for (int i = 0; i < topicsResult.size(); i++) {
Log.i("Topic", topicsResult.get(i).getTopicId().toString());
}
if (topicsResult.size() == 0) {
Log.i("Topic", "Returned Empty");
}
}
@Override
public void onError(@NonNull Exception error) {
// Handle error
Log.i("Topic", "Experienced an error, and did not return successfully");
}
};
Gdy konfiguracja zostanie zakończona, możesz zadzwonić, aby otrzymać GetTopicsResponse
w ramach metody getTopics()
:
Kotlin
mTopicsManager.getTopics(mTopicsRequestBuilder.build(), mExecutor,
mCallback as OutcomeReceiver<GetTopicsResponse, java.lang.Exception>)
Java
mTopicsManager.getTopics(mTopicsRequestBuilder.build(), mExecutor, mCallback);
Ten wywołanie zwróci listę obiektów Topics zawierających wartości identyfikatorów odpowiadających tematom w mapie kategorii open source, które są istotne dla użytkownika, lub odpowiedni błąd. Tematy będą wyglądać mniej więcej tak:
/Internet & Telecom/Text & Instant Messaging
Listę możliwych tematów, które mogą zostać zwrócone, znajdziesz w taksonomii. Ta taksonomia jest dostępna w wersji open source, a sugerowane zmiany można przesyłać za pomocą przycisku opinii u góry tej strony.
Testowanie
Interfejs Topics API dostarcza aktualnych tematów na podstawie korzystania z aplikacji. Ta wstępna wersja zawiera podgląd zachowania interfejsu API. W przyszłych wersjach poprawimy jakość tematów.
Aby uzyskać jak najwięcej informacji, zalecamy środowisko testowe z kilkoma aplikacjami, w których wywołujesz funkcję getTopics()
, aby zobaczyć, jak są wybierane tematy. Repozytorium interfejsów API do ochrony prywatności i środowiska wykonawczego SDK na GitHubie zawiera zestaw poszczególnych projektów Android Studio, które pomogą Ci zacząć, w tym przykłady pokazujące, jak inicjować i wywoływać interfejs Topics API.
Obliczenie tematów następuje na końcu okresu. Domyślnie każdy okres epoch trwa 7 dni, ale możesz zmodyfikować ten interwał, aby uzyskać wynik. To polecenie Android Debug Bridge w powłoce powoduje skrócenie długości ery do 5 minut:
adb shell device_config put adservices topics_epoch_job_period_ms 300000
Wartość topics_epoch_job_period_ms
możesz potwierdzić za pomocą get
:
adb shell device_config get adservices topics_epoch_job_period_ms
Aby ręcznie wywołać obliczanie epoki, uruchom to polecenie:
adb shell cmd jobscheduler run -f com.google.android.adservices.api 2
Oprócz przykładowej aplikacji możesz też skorzystać z platformy Colab, aby testować różne kombinacje informacji o aplikacji w powiązaniu z klasyfikatorem tematów. Użyj tego colab, aby zobaczyć, jakie wyniki prawdopodobnie uzyska Twoja aplikacja po wywołaniu funkcji getTopics
.
Szczegóły szyfrowania
Wraz z wprowadzeniem szyfrowania wywołania do GetTopics()
będą teraz generować odpowiedź z listą obiektów EncryptedTopic
. Odszyfrowanie tych wyników spowoduje utworzenie obiektu w tym samym formacie JSON co poprzedni obiekt Topic
.
Interfejs Topics API obsługuje jednorazową implementację szyfrowania hybrydowego kluczem publicznym (HPKE). Oczekujemy, że zarejestrowany dzwoniący będzie hostować 32-bitowy klucz publiczny na publicznym adresie URL szyfrowania podanym podczas rejestracji. Te klucze powinny być zakodowane w formacie Base64.
Obiekt EncryptedTopic
ma 3 pola. Listę zwróconych tematów można uzyskać, używając klucza prywatnego odpowiadającego kluczowi publicznemu.
Na potrzeby programowania możesz przetestować szyfrowanie interfejsu Topics API, wyłączając weryfikację rejestracji. Spowoduje to, że interfejs API będzie używać testowego klucza publicznego do szyfrowania odpowiedzi. Zaszyfrowane tematy możesz odszyfrować za pomocą odpowiedniego klucza prywatnego.
Ograniczenia
Listę funkcji interfejsu Topics API, które są w trakcie opracowywania, znajdziesz w informacjach o wersji.
Zgłaszanie błędów i problemów
Twoja opinia jest bardzo ważna dla Piaskownicy prywatności na Androida. Poinformuj nas o problemach, które zauważysz, lub o swoich pomysłach na udoskonalenie Piaskownicy prywatności na Androida.
Dalsze kroki
Kontrola i przejrzystość
Omówienie Topics na Androida
Zobacz też
Zapoznaj się z naszymi materiałami, aby lepiej zrozumieć interfejs Topics API na Androida.
- Zapoznaj się z przykładowymi aplikacjami, filmami z poradami i filmami z serii Topics.
- Zobacz, jak użytkownicy i deweloperzy mogą kontrolować interfejs API.
- Zapoznaj się z zasobami pomocy, aby zadawać pytania, nawiązywać kontakt z innymi i dzielić się opiniami.