במדריך הזה מוסבר איך להטמיע ממשק משתמש מותאם אישית באמצעות IMA SDK ל-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()
כדי לבדוק ש-UI ברירת המחדל של המודעה הושבת, מפעילים את הפונקציות Ad.getAdPodInfo()
ו-AdsManager.getAdProgress()
כדי למצוא את המיקום של המודעה ב-pod ואת ההתקדמות שלה. במודעות שניתן לדלג עליהן, כדאי להציג ספירת זמן לדילוג אם עדיין אי אפשר לדלג על המודעה. אחרת, כדאי להציג כפתור לדילוג. ריכזנו כאן סיכום של פרטי מודעות נפוצים והקריאות המשויכות:
מידע | התקשרות |
---|---|
המודעה הנוכחית ברצף המודעות | 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
. בנוסף, כדי להשבית ממשק משתמש של מודעה, צריך להפעיל את הרשת ב-Ad Manager. אם האפשרות מופעלת, קובץ ה-VAST מכיל את הקודExtension
שנראה כך: אם הבעיה נמשכת, כדאי לפנות למנהל החשבון כדי לוודא שהחשבון שלכם מופעל. סוגים מסוימים של מודעות דורשים ממשק משתמש ספציפי. המודעות האלה מחזירות את הערך 0 עבור<Extension type="uiSettings"> <UiHideable>1</UiHideable> </Extension>
<UiHideable>
. אם נתקלתם בבעיה כזו, צוות ניהול התנועה יצטרך לבצע שינויים כדי לוודא שסוגי המודעות האלה לא יוצגו.