ضبط إعدادات الجهاز
لتنفيذ Topics API، عليك أولاً إعداد بيئة التطوير. لتنفيذ خطوات الإعداد التالية:
استخدِم أحدث إصدار من حزمة تطوير البرامج (SDK) لمبادرة حماية الخصوصية على Android للحصول على أحدث إصدار من واجهات برمجة التطبيقات التي تحافظ على الخصوصية.
أضِف ما يلي إلى البيان:
الإذن: أدرِج إذن
ACCESS_ADSERVICES_TOPICS
للسماح لتطبيقك بالوصول إلى Topics API:<uses-permission android:name="android.permission.ACCESS_ADSERVICES_TOPICS" />
إعدادات "خدمات الإعلانات": يمكنك الإشارة إلى ملف إعدادات "خدمات الإعلانات" في عنصر
<application>
من ملف البيان.<property android:name="android.adservices.AD_SERVICES_CONFIG" android:resource="@xml/ad_services_config" />
حدِّد مرجع XML لـ "خدمات Google الإعلانية" المُشار إليه في البيان، مثل
res/xml/ad_services_config.xml
. استخدِم سمةallowAllToAccess
لمنح الإذن بالوصول إلى كل حِزم SDK، أو سمةallowSdksToAccess
لمنح الإذن بالوصول إلى حِزم SDK فردية. مزيد من المعلومات حول أذونات "خدمات Google الإعلانية" والتحكّم في الوصول إلى حِزم تطوير البرامج (SDK)<ad-services-config> <topics allowAllToAccess="true"/> </ad-services-config>
تسجيل تكنولوجيا الإعلان في "مبادرة حماية الخصوصية" لاستدعاء 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");
}
};
بعد اكتمال الإعداد، يمكنك إجراء مكالمة لتلقّي رمز 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 مواضيع جديدة وملائمة استنادًا إلى استخدام التطبيقات. يقدّم هذا الإصدار المبكر معاينة لسلوكيات واجهة برمجة التطبيقات، وسنعمل على تحسين جودة topics في الإصدارات المستقبلية.
للحصول على التجربة الأفضل، ننصحك ببيئة اختبار تتضمّن عدة
تطبيقات يمكنك من خلالها الاتصال برقم getTopics()
لمعرفة كيفية اختيار المواضيع. يحتوي
مستودع وقت تشغيل حزمة تطوير البرامج (SDK) وواجهات برمجة التطبيقات التي تحافظ على الخصوصية
على GitHub على مجموعة من مشاريع "استوديو Android" الفردية لمساعدتك في البدء، بما في ذلك عيّنات توضّح كيفية إعداد واجهة برمجة التطبيقات Topics API وطلب بيانات منها.
يتم احتساب المواضيع في نهاية حقبة. تكون مدة كل فترة زمنية تلقائيًا 7 أيام، ولكن يمكنك تعديل هذا الفاصل الزمني للحصول على نتيجة. يُقصِّر طلب shell التالي من Android Debug Bridge مدة الحقبة إلى 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
يمكنك استخدامه لاختبار مجموعات مختلفة من معلومات التطبيق وفقًا لتصنيف topics. استخدِم هذه التجربة التعاونية للاطّلاع على أنواع النتائج التي يُحتمل أن يحصل عليها تطبيقك عند الاتصال بـ getTopics
.
تفاصيل التشفير
مع إدخال التشفير، ستؤدي المكالمات إلى GetTopics()
الآن إلى إنشاء
استجابة تتضمّن قائمة بعناصر EncryptedTopic
. سيؤدي فك تشفير هذه النتائج
إلى إنشاء عنصر بتنسيق JSON نفسه لعنصر Topic
السابق.
تتيح Topics API تنفيذ HPKE (التشفير باستخدام مفتاح عمومي مختلط) لمرة واحدة. نتوقع أن يستضيف المتصل المسجَّل مفتاحًا عامًا بسعة 32 بت على نقطة نهاية عنوان URL للتشفير العلني المقدَّمة أثناء التسجيل. من المفترض أن تكون هذه المفاتيح مشفّرة باستخدام Base64.
يحتوي عنصر EncryptedTopic
على ثلاثة حقول. يمكن
الحصول على قائمة المواضيع المعروضة باستخدام المفتاح الخاص المقابل للمفتاح العام.
لأغراض التطوير، يمكنك اختبار تشفير Topics API من خلال إيقاف فحص التسجيل. سيؤدي ذلك إلى إجبار واجهة برمجة التطبيقات على استخدام المفتاح العام التجريبي ل تشفير الردود. يمكنك فك تشفير المواضيع المشفّرة باستخدام المفتاح الخاص المقابل.
القيود
للحصول على قائمة بالميزات قيد التطوير في Topics API، يُرجى الرجوع إلى ملاحظات الإصدار.
الإبلاغ عن الأخطاء والمشاكل
ملاحظاتك هي جزء مهم من "مبادرة حماية الخصوصية" على Android. يُرجى إعلامنا بأي مشاكل تواجهها أو أفكار لتحسين "مبادرة حماية الخصوصية" على Android.
الخطوات التالية
التحكّم والشفافية
نظرة عامة على Topics على Android
انظر أيضًا
يمكنك الاطّلاع على مراجعنا لفهم Topics API على Android بشكل أفضل.
- يمكنك الاطّلاع على نماذج تطبيقات ومحتوى تعاون وجولة تفصيلية حول Topics.
- تعرَّف على كيفية تمكُّن المستخدمين والمطوّرين من التحكُّم في واجهة برمجة التطبيقات.
- يمكنك الاطّلاع على مراجع الدعم لطرح الأسئلة والتفاعل مع المستخدمين ومشاركة الملاحظات.