ตั้งค่า
หากต้องการติดตั้งใช้งาน Topics API คุณต้องตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์เสียก่อน โดยทำตามขั้นตอนการตั้งค่าต่อไปนี้
ใช้ Android Privacy Sandbox SDK เวอร์ชันล่าสุดเพื่อรับ API การรักษาความเป็นส่วนตัวเวอร์ชันล่าสุด
เพิ่มรายการต่อไปนี้ลงในไฟล์ Manifest
สิทธิ์: ใส่สิทธิ์
ACCESS_ADSERVICES_TOPICSเพื่ออนุญาตให้แอปเข้าถึง Topics API<uses-permission android:name="android.permission.ACCESS_ADSERVICES_TOPICS" />การกำหนดค่าบริการโฆษณา: อ้างอิงไฟล์การกำหนดค่าบริการโฆษณาในองค์ประกอบ
<application>ของไฟล์ Manifest<property android:name="android.adservices.AD_SERVICES_CONFIG" android:resource="@xml/ad_services_config" />ระบุทรัพยากร XML ของบริการโฆษณาที่อ้างอิงในไฟล์ Manifest เช่น
res/xml/ad_services_config.xmlใช้แอตทริบิวต์allowAllToAccessเพื่อให้สิทธิ์เข้าถึง SDK ทั้งหมด หรือใช้แอตทริบิวต์allowSdksToAccessเพื่อให้สิทธิ์เข้าถึง SDK แต่ละรายการ ดูข้อมูลเพิ่มเติมเกี่ยวกับ สิทธิ์ของบริการโฆษณาและการควบคุมการเข้าถึง SDK<ad-services-config> <topics allowAllToAccess="true"/> </ad-services-config>
ลงทะเบียนเทคโนโลยีโฆษณาของคุณกับ Privacy Sandbox เพื่อเรียกใช้ Topics API ใน SDK สำหรับการทดสอบในเครื่อง คุณสามารถปิดใช้การตรวจสอบการลงทะเบียน Topics ได้ด้วยคำสั่งต่อไปนี้
adb shell setprop debug.adservices.disable_topics_enrollment_check trueเปิดใช้การเข้าถึง Topics API โดยค่าเริ่มต้น Topics API จะปิดใช้อยู่ คุณต้องเปิดใช้โดยใช้คำสั่ง ADB ดังนี้
adb shell device_config put adservices ppapi_app_signature_allow_list \"\*\"adb shell setprop debug.adservices.disable_topics_enrollment_check trueเริ่มการติดตั้งใช้งานโดยแยกเวอร์ชัน Java หรือ Kotlin ของแอปตัวอย่างเพื่อทำความคุ้นเคยกับวิธีดึงข้อมูลหัวข้อในอุปกรณ์
ขอชุดหัวข้อ
ฟังก์ชันการทำงานหลักของ Topics API อยู่ในเมธอด getTopics()
ภายในออบเจ็กต์ TopicsManager
ดังที่แสดงในตัวอย่างนี้
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)
หากต้องการใช้เมธอดนี้ ให้เริ่มต้นออบเจ็กต์ TopicsManager และพารามิเตอร์ที่จำเป็นในการรับข้อมูลหัวข้อ GetTopicsRequest จะส่งข้อมูลที่จำเป็นเพื่อดึงข้อมูล Topics API ซึ่งรวมถึงแฟล็กเพื่อระบุว่าผู้เรียกจะทำหน้าที่เป็นผู้สังเกตการณ์หรือไม่ เมื่อไม่ ทำหน้าที่เป็นผู้สังเกตการณ์ การเรียก getTopics จะแสดงผลหัวข้อจากยุคก่อนหน้า แต่จะไม่ส่งผลต่อข้อมูลหัวข้อสำหรับยุคถัดไป การเรียกกลับจะจัดการผลลัพธ์แบบไม่พร้อมกันOutcomeReceiver เช่น
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");
}
};
เมื่อตั้งค่า setup เรียบร้อยแล้ว คุณสามารถเรียกใช้เพื่อรับ
GetTopicsResponse
เป็นผลลัพธ์จากเมธอด getTopics() ได้
Kotlin
mTopicsManager.getTopics(mTopicsRequestBuilder.build(), mExecutor,
mCallback as OutcomeReceiver<GetTopicsResponse, java.lang.Exception>)
Java
mTopicsManager.getTopics(mTopicsRequestBuilder.build(), mExecutor, mCallback);
การเรียกใช้นี้จะแสดงรายการออบเจ็กต์ Topics ที่มีค่ารหัส ซึ่งสอดคล้องกับหัวข้อในการจัดหมวดหมู่แบบโอเพนซอร์สที่เกี่ยวข้องกับผู้ใช้ หรือข้อผิดพลาดที่เกี่ยวข้อง หัวข้อจะมีลักษณะคล้ายกับตัวอย่างนี้
/Internet & Telecom/Text & Instant Messaging
ดูรายการหัวข้อที่เป็นไปได้ที่อาจแสดงผลได้ในการจัดหมวดหมู่ การจัดหมวดหมู่นี้เป็นแบบโอเพนซอร์ส และคุณสามารถยื่นคำขอเปลี่ยนแปลงที่แนะนำได้โดยใช้ปุ่มความคิดเห็นที่ด้านบนของหน้านี้
การทดสอบ
Topics API จะแสดงหัวข้อที่เกี่ยวข้องและใหม่ล่าสุดโดยอิงตามการใช้งานแอป เวอร์ชันแรกนี้จะแสดงตัวอย่างลักษณะการทำงานของ API และเราจะปรับปรุงคุณภาพของหัวข้อในรุ่นต่อๆ ไป
เราขอแนะนำให้ใช้สภาพแวดล้อมการทดสอบที่มีแอปหลายแอปที่คุณเรียกใช้ getTopics() เพื่อดูวิธีเลือกหัวข้อเพื่อให้ได้รับประสบการณ์การใช้งานอย่างเต็มที่ ที่เก็บ
รันไทม์ของ SDK และ Privacy Preserving APIs
ใน GitHub มีชุดโปรเจ็กต์ Android Studio แต่ละรายการที่จะช่วยให้คุณเริ่มต้น
ใช้งานได้ ซึ่งรวมถึงตัวอย่างที่แสดงวิธีเริ่มต้นและเรียกใช้ Topics API
การคำนวณหัวข้อจะเกิดขึ้นเมื่อสิ้นสุดยุค โดยค่าเริ่มต้น แต่ละยุคจะมีความยาว 7 วัน แต่คุณสามารถแก้ไขช่วงเวลานี้เพื่อรับผลลัพธ์ได้ คำสั่งเชลล์ Android Debug Bridge นี้จะลดความยาวของ Epoch ลงเหลือ 5 นาที
adb shell device_config put adservices topics_epoch_job_period_ms 300000คุณสามารถยืนยันค่า topics_epoch_job_period_ms ด้วย get ได้
adb shell device_config get adservices topics_epoch_job_period_msหากต้องการทริกเกอร์การคำนวณยุคด้วยตนเอง ให้เรียกใช้คำสั่งต่อไปนี้
adb shell cmd jobscheduler run -f com.google.android.adservices.api 2นอกจากการใช้แอปตัวอย่างแล้ว ยังมี Colab ที่
คุณใช้ทดสอบการผสมผสานข้อมูลแอปต่างๆ กับตัวแยกประเภทหัวข้อ
ได้ด้วย ใช้ Colab นี้เพื่อดูประเภทผลลัพธ์ที่แอปของคุณน่าจะได้รับเมื่อเรียกใช้ getTopics
รายละเอียดการเข้ารหัส
เมื่อมีการเปิดตัวการเข้ารหัส การเรียกใช้ GetTopics() จะสร้างการตอบกลับพร้อมรายการออบเจ็กต์ EncryptedTopic การถอดรหัสผลลัพธ์เหล่านี้จะ
แสดงผลออบเจ็กต์ที่มีรูปแบบ JSON เดียวกับออบเจ็กต์ Topic
Topics API รองรับการติดตั้งใช้งาน HPKE (การเข้ารหัสคีย์สาธารณะแบบไฮบริด) แบบครั้งเดียว เราคาดหวังให้ผู้เรียกที่ลงทะเบียนโฮสต์คีย์สาธารณะ 32 บิตในปลายทาง URL การเข้ารหัสสาธารณะที่ให้ไว้ระหว่างการลงทะเบียน คีย์เหล่านี้คาดว่าจะได้รับการเข้ารหัสแบบ Base64
ออบเจ็กต์ EncryptedTopic มี 3 ช่อง คุณสามารถรับรายการหัวข้อที่แสดงผลได้โดยใช้คีย์ส่วนตัวที่เกี่ยวข้องกับคีย์สาธารณะ
สำหรับการพัฒนา คุณสามารถทดสอบการเข้ารหัส Topics API ได้โดยปิดใช้การตรวจสอบการลงทะเบียน ซึ่งจะบังคับให้ API ใช้คีย์สาธารณะทดสอบเพื่อเข้ารหัสการตอบกลับ คุณสามารถถอดรหัสหัวข้อที่เข้ารหัสได้โดยใช้คีย์ส่วนตัวที่เกี่ยวข้อง
ข้อจำกัด
ดูรายการความสามารถที่อยู่ระหว่างการพัฒนาสำหรับ Topics API ได้ใน บันทึกประจำรุ่น
รายงานข้อบกพร่องและปัญหา
ความคิดเห็นของคุณเป็นส่วนสำคัญของ Privacy Sandbox ใน Android โปรดแจ้งให้เราทราบ เกี่ยวกับปัญหาที่พบหรือแนวคิดในการปรับปรุง Privacy Sandbox ใน Android
ขั้นตอนถัดไป
การควบคุมและความโปร่งใส
ภาพรวมของ Topics ใน Android
ดูเพิ่มเติม
ดูแหล่งข้อมูลของเราเพื่อทำความเข้าใจเกี่ยวกับ Topics API บน Android ให้ดียิ่งขึ้น
- ดูตัวอย่างแอป วิดีโอการทำงานร่วมกัน และวิดีโอแนะนำการใช้งานของ Topics
- ดูว่าผู้ใช้และนักพัฒนาซอฟต์แวร์จะควบคุม API นี้ได้อย่างไร
- โปรดดูแหล่งข้อมูลการสนับสนุนเพื่อถามคำถาม มีส่วนร่วม และแชร์ความคิดเห็น