يوضّح هذا الدليل كيفية تنفيذ واجهة المستخدم المخصّصة باستخدام حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية (IMA) لنظام التشغيل Android. ولإجراء ذلك، عليك إيقاف واجهة المستخدم التلقائية وإعداد واجهة مستخدم مخصّصة جديدة، ثمّ تعبئة واجهة المستخدم الجديدة بمعلومات الإعلانات التي تم الحصول عليها من حزمة تطوير البرامج (SDK).
إيقاف واجهة مستخدِم الإعلان
لعرض واجهة مستخدم مخصّصة، عليك أولاً إيقاف واجهة مستخدم الإعلان التلقائية. لإجراء ذلك، يمكنك استدعاء
AdsRenderingSettings.setDisableUi()
ثم تمرير AdsRenderingSettings
إلى AdsManager.init()
:
MyActivity.java
ImaSdkFactory mSdkFactory = ImaSdkFactory.getInstance(); AdsManager mAdsManager; @Override public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) { mAdsManager = adsManagerLoadedEvent.getAdsManager(); ... AdsRenderingSettings settings = mSdkFactory.createAdsRenderingSettings(); settings.setDisableUi(true); mAdsManager.init(settings); }
بعد ذلك، كلما أردت تحديد ما إذا كنت تريد عرض واجهة المستخدم المخصّصة، تحقّق مما إذا كان هناك إعلان، واتصل بـ Ad.isUiDisabled()
للتأكّد من إيقاف واجهة مستخدم الإعلان الافتراضية.
عرض واجهة مستخدم مخصّصة
بعد إيقاف واجهة المستخدم التلقائية، تكون الخطوة التالية هي عرض واجهة مستخدم مخصّصة للإعلان.
في هذا المثال، أضِف RelativeLayout
جديدًا إلى تنسيق مشغّل الفيديو الحالي، ثم أظهِر هذا التنسيق عند عرض إعلان وأخفِه عندما لا يتم عرض إعلانات.
أضِف ما يلي إلى ملف تنسيق المقتطف:
fragment_video.xml
<com.google.ads.interactivemedia.v3.samples.samplevideoplayer.SampleVideoPlayer android:id="@+id/sampleVideoPlayer" android:layout_width="match_parent" android:layout_height="match_parent" /> <RelativeLayout android:id="@+id/customUi" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="invisible"> <TextView android:id="@+id/adCounter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/holo_green_light" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:text="@string/ad_counter" /> <Button android:id="@+id/learnMoreButton" android:background="@android:color/holo_green_light" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:text="@string/learn_more" android:layout_alignParentRight="true" /> <Button android:id="@+id/skipButton" android:background="@android:color/holo_green_light" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="@string/skip_ad" android:enabled="false" android:layout_alignParentRight="true" /> </RelativeLayout>
بعد ذلك، أضِف الرمز لاستخدام واجهة المستخدم المخصّصة إلى Activity
. لتعديل واجهة المستخدم،
أنشئ موقّتًا Handler
وRunnable
يعمل عليه.
MyActivity.java
// The view containing the custom UI. private View mCustomUi; // The timer handler. private Handler mTimerHandler = new Handler(); // The Runnable that runs your custom UI update loop. private Runnable mTimerRunnable = new Runnable() { @Override public void run() { updateCustomUi(); mTimerHandler.postDelayed(this, 500); } }; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... mCustomUi = rootView.findViewById(R.id.customUi); mAdCounterUi = (TextView) rootView.findViewById(R.id.adCounter); } @Override public void onAdEvent(AdEvent adEvent) { ... switch (adEvent.getType()) { ... case STARTED: // Start your update loop. mTimerHandler.post(mTimerRunnable); Break; ... case COMPLETED: mCustomUi.setVisibility(View.INVISIBLE); mTimerHandler.removeCallbacks(mTimerRunnable); ... } } @Override public void onPause() { ... // Stop ad UI update loop. mTimerHandler.removeCallbacks(mTimerRunnable); } @Override Public void onResume() { ... // Start ad UI update loop. mTimerHandler.post(mTimerRunnable); }
عداد الإعلانات وزر التخطّي
حدِّد الآن دالة updateCustomUi()
لملء واجهة المستخدم بمعلومات
الإعلانات. تختلف التفاصيل حسب شكل الإعلان، ولكن غالبًا ما يتم تضمين عداد الإعلانات وزر أو عداد للتخطّي إذا كان الإعلان قابلاً للتخطّي. أضِف ما يلي:
MyActivity.java
private void updateCustomUi() { // Runs from the update loop to update the custom UI. Ad ad = mAdsManager.getCurrentAd(); if (ad != null && ad.isUiDisabled()) { // Show the UI. Log.i(LOGTAG, "UI disabled, show custom UI!"); AdPodInfo podInfo = ad.getAdPodInfo(); VideoProgressUpdate update = mAdsManager.getAdProgress(); SimpleDateFormat format = new SimpleDateFormat("mm:ss", Locale.US); // Handle ad counter. String adProgress = format.format( (update.getDuration() - update.getCurrentTime()) * 1000); String adUiString = String.format( Locale.US, "Ad %d of %d (%s)", podInfo.getAdPosition(), podInfo.getTotalAds(), adProgress); mAdCounterUi.setText(adUiString); // Handle skippable ads. if (ad.isSkippable()) { if (update.getCurrentTime() >= ad.getSkipTimeOffset()) { // Allow skipping. mSkipButton.setText(getString(R.string.skip_ad)); mSkipButton.setEnabled(true); } else { String skipString = String.format( Locale.US, "You can skip this ad in %d", (int) (ad.getSkipTimeOffset() - update.getCurrentTime())); mSkipButton.setText(skipString); mSkipButton.setEnabled(false); } mSkipButton.setVisibility(View.VISIBLE); } else { mSkipButton.setVisibility(View.INVISIBLE); } mCustomUi.setVisibility(View.VISIBLE); mCustomUi.bringToFront(); } else { // Hide the UI. mCustomUi.setVisibility(View.INVISIBLE); mTimerHandler.removeCallbacks(mTimerRunnable); } }
في الرمز السابق، بعد التحقّق ممّا إذا كان هناك إعلان واستخدام الإجراء
Ad.isUiDisabled()
للتحقّق من إيقاف واجهة مستخدِم الإعلان التلقائية، استخدِم الإجراء
Ad.getAdPodInfo()
وAdsManager.getAdProgress()
للعثور على موضع الإعلان
في مجموعة الإعلانات المتسلسلة ومستوى تقدّم الإعلان. بالنسبة إلى الإعلانات القابلة للتخطّي، يجب عرض عدّاد للتخطّي إذا
لم يكن بإمكانك تخطّي الإعلان بعد، وإلا يجب عرض زرّ للتخطّي. في ما يلي ملخّص
لمعلومات الإعلانات الشائعة والمكالمات المرتبطة بها:
معلومات | الاتصال |
---|---|
الإعلان الحالي في مجموعة الإعلانات | Ad.getAdPodInfo().getAdPosition() |
إجمالي الإعلانات في مجموعة الإعلانات المتسلسلة | Ad.getPodInfo().getTotalAds() |
ما إذا كان الإعلان قابلاً للتخطّي | Ad.isSkippable() |
الثواني المتبقية قبل أن يصبح بإمكانك تخطّي الإعلان | Ad.getSkipTimeOffset() - AdsManager.getAdProgress().getCurrentTime() |
الثواني المتبقية في الإعلان | (AdsManager.getAdProgress().getDuration() - AdsManager.getAdProgress().getCurrentTime()) * 1000 |
من المفترض أن يؤدي النقر على الزر تخطّي الإعلان إلى تخطّي الإعلان، لذا عليك إعداد ذلك، بالإضافة إلى الزر مزيد من المعلومات:
MyActivity.java
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... mCustomUi = rootView.findViewById(R.id.customUi); mAdCounterUi = (TextView) rootView.findViewById(R.id.adCounter); // Set up the 'learn more' button handler for the custom UI. mLearnMoreButton = (Button) rootView.findViewById(R.id.learnMoreButton); mLearnMoreButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { // Only works if the UI has been disabled. mAdsManager.clicked(); } }); // Set up the skip button handler for the custom UI. mSkipButton = (Button) rootView.findViewById(R.id.skipButton); mSkipButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { mAdsManager.skip(); } });
يجب إيقاف واجهة المستخدم لكي تعمل AdsManager.clicked()
.
تحديد المشاكل وحلّها
- هل لديك نموذج علامة مفعّل لإيقاف واجهة مستخدِم الإعلان؟
- يمكنك نسخ عنوان URL الخاص بهذه علامة النموذج ولصقه في عملية تنفيذ IMA.
- لا يمكنني إيقاف واجهة المستخدم التلقائية.
- تأكَّد من أنّك تتصل بـ
AdsRenderingSettings.setDisableUi()
و تمرّر الطلب إلىAdsManager
. تأكَّد من أنّAd.isUiDisabled()
يعرضtrue
. بالإضافة إلى ذلك، يجب تفعيل شبكتك في "مدير إعلانات Google" لإيقاف واجهة مستخدم إعلانات. إذا كان لديك إذن، ستتضمّن ملفّات VASTExtension
على النحو التالي: إذا كنت لا تزال تواجه مشكلة، يُرجى التواصل مع مدير حسابك للتأكّد من تفعيل هذه الميزة. تتطلّب بعض أنواع الإعلانات واجهة مستخدم معيّنة، وتعرض هذه الإعلانات قيمة<Extension type="uiSettings"> <UiHideable>1</UiHideable> </Extension>
<UiHideable>
تساوي 0. إذا واجهت هذا الخطأ، على فريق الإحالة الناجحة إجراء تغييرات للتأكّد من عدم عرض أنواع الإعلانات هذه.