Konfiguracja
Aby zaimplementować interfejs Topics API, musisz najpierw skonfigurować środowisko programistyczne. Wykonaj te czynności:
Użyj najnowszego pakietu SDK Piaskownicy prywatności Androida, aby uzyskać najbardziej aktualną wersję chroniących prywatność interfejsów API.
Dodaj do pliku manifestu te elementy:
Uprawnienie: 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 elemencie
<application>w pliku manifestu dodaj odwołanie do pliku konfiguracyjnego usług reklamowych.<property android:name="android.adservices.AD_SERVICES_CONFIG" android:resource="@xml/ad_services_config" />Określ zasób XML usług reklamowych, do którego odwołujesz się w pliku manifestu, np.
res/xml/ad_services_config.xml. Aby przyznać dostęp do wszystkich pakietów SDK, użyj atrybutuallowAllToAccess, a aby przyznać dostęp do poszczególnych pakietów SDK, użyj atrybutuallowSdksToAccess. Więcej informacji o uprawnieniach usług reklamowych i kontroli dostępu do pakietu SDK.<ad-services-config> <topics allowAllToAccess="true"/> </ad-services-config>
Zarejestruj technologię reklamową w Piaskownicy prywatności, aby wywoływać interfejs Topics API w pakiecie SDK. Aby przeprowadzić testy lokalne, możesz wyłączyć sprawdzanie rejestracji w interfejsie Topics API za pomocą tych poleceń:
adb shell setprop debug.adservices.disable_topics_enrollment_check trueWłą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 trueZacznij implementację, tworząc fork wersji przykładowej aplikacji w języku Java lub Kotlin, aby zapoznać się z tym, jak pobierać tematy na urządzeniu.
Wysyłanie prośby o zestaw tematów
Główna funkcja interfejsu Topics API znajduje się w metodzie getTopics()
w obiekcie TopicsManager, jak pokazano 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 niezbędne do otrzymywania danych o tematach. GetTopicsRequest przekazuje informacje potrzebne do pobrania danych z interfejsu Topics API, w tym flagę wskazującą, czy wywołujący będzie działać jako obserwator. Jeśli nie działa jako obserwator, wywołanie getTopics zwraca temat z poprzedniej epoki, ale nie wpłynie na dane o tematach w następnej epoce. Wywołanie zwrotne obsługuje wynik asynchronicznie.OutcomeReceiver 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 będzie gotowa, możesz wywołać metodę getTopics(), aby otrzymać
GetTopicsResponse
:
Kotlin
mTopicsManager.getTopics(mTopicsRequestBuilder.build(), mExecutor,
mCallback as OutcomeReceiver<GetTopicsResponse, java.lang.Exception>)
Java
mTopicsManager.getTopics(mTopicsRequestBuilder.build(), mExecutor, mCallback);
To wywołanie zwróci listę obiektów Topics zawierających wartości identyfikatorów odpowiadające tematom w taksonomii open source taxonomy, które są istotne dla użytkownika, lub odpowiedni błąd. Tematy będą podobne do tych w tym przykładzie:
/Internet & Telecom/Text & Instant Messaging
Listę możliwych tematów, które mogą zostać zwrócone, znajdziesz w taksonomii. Ta taksonomia jest dostępna na licencji open source, a sugerowane zmiany można zgłaszać za pomocą przycisku opinii u góry tej strony.
Testowanie
Interfejs Topics API udostępnia odpowiednie i aktualne tematy na podstawie korzystania z aplikacji. Ta wczesna wersja zawiera podgląd zachowań interfejsu API, a w przyszłych wersjach poprawimy jakość tematów.
Aby uzyskać jak najlepsze wrażenia, zalecamy korzystanie ze środowiska testowego z wieloma aplikacjami, w którym wywołujesz metodę getTopics(), aby sprawdzić, jak wybierane są tematy. Repozytorium
środowiska wykonawczego SDK i chroniących prywatność interfejsów API
na GitHubie zawiera zestaw pojedynczych projektów Android Studio, które pomogą Ci
zacząć, w tym przykłady pokazujące, jak zainicjować i wywołać interfejs Topics API.
Obliczanie tematów odbywa się na końcu epoki. Domyślnie każda epoka trwa 7 dni, ale możesz zmienić ten interwał, aby uzyskać wynik. To polecenie powłoki Android Debug Bridge skraca długość epoki do 5 minut:
adb shell device_config put adservices topics_epoch_job_period_ms 300000Możesz potwierdzić wartość topics_epoch_job_period_ms za pomocą polecenia get:
adb shell device_config get adservices topics_epoch_job_period_msAby ręcznie uruchomić obliczanie epoki, wykonaj to polecenie:
adb shell cmd jobscheduler run -f com.google.android.adservices.api 2Oprócz korzystania z przykładowej aplikacji możesz użyć Colaba, aby
przetestować różne kombinacje informacji o aplikacji w klasyfikatorze
tematów. Użyj tego Colaba, aby zobaczyć, jakie wyniki prawdopodobnie otrzyma Twoja aplikacja po wywołaniu metody getTopics.
Szczegóły szyfrowania
Wraz z wprowadzeniem szyfrowania wywołania metody 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 Topic obiekt.
Interfejs Topics API obsługuje jednorazową implementację HPKE (Hybrid Public Key Encryption). Oczekujemy, że zarejestrowany wywołujący będzie hostować 32-bitowy klucz publiczny w punkcie końcowym publicznego adresu URL szyfrowania podanym podczas rejestracji. Te klucze powinny być zakodowane w formacie Base64.
Obiekty EncryptedTopic mają 3 pola. Listę zwróconych tematów można uzyskać za pomocą odpowiedniego klucza prywatnego do klucza publicznego.
Na potrzeby programowania możesz przetestować szyfrowanie w interfejsie Topics API, wyłączając sprawdzanie 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, nad którymi pracujemy w przypadku interfejsu Topics API, znajdziesz w informacjach o wersji.
Zgłaszanie błędów i problemów
Twoja opinia jest ważną częścią Piaskownicy prywatności na Androida. Poinformuj nas o wszelkich problemach lub pomysłach na ulepszenie 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.