Giao diện người dùng tuỳ chỉnh với SDK IMA cho Android

Hướng dẫn này trình bày cách triển khai giao diện người dùng tuỳ chỉnh của riêng bạn bằng cách sử dụng SDK IMA dành cho Android. Để làm như vậy, bạn cần tắt giao diện người dùng mặc định, thiết lập một giao diện người dùng tuỳ chỉnh mới, sau đó điền sẵn giao diện người dùng mới bằng thông tin quảng cáo lấy từ SDK.

Tắt giao diện người dùng quảng cáo

Để hiển thị giao diện người dùng tuỳ chỉnh, trước tiên, bạn phải tắt giao diện người dùng mặc định của quảng cáo. Để thực hiện việc này, hãy gọi AdsRenderingSettings.setDisableUi() rồi chuyển AdsRenderingSettings đến 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);
}

Sau đó, mỗi khi bạn cần quyết định có hiển thị giao diện người dùng tuỳ chỉnh hay không, hãy kiểm tra xem có quảng cáo hay không và gọi Ad.isUiDisabled() để kiểm tra để đảm bảo rằng giao diện người dùng quảng cáo mặc định đã bị tắt.

Hiện giao diện người dùng tuỳ chỉnh

Sau khi đã tắt giao diện người dùng mặc định, bước tiếp theo là hiển thị giao diện người dùng của quảng cáo tuỳ chỉnh. Trong ví dụ này, hãy thêm RelativeLayout mới vào bố cục trình phát video hiện có, sau đó hiển thị bố cục này khi quảng cáo đang phát và ẩn bố cục đó khi không có quảng cáo nào đang phát.

Thêm đoạn mã sau đây vào tệp bố cục mảnh:

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>

Sau đó, hãy thêm mã để sử dụng giao diện người dùng tuỳ chỉnh vào Activity. Để cập nhật giao diện người dùng, hãy tạo một bộ tính giờ HandlerRunnable chạy trên đó.

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);
}

Bộ đếm quảng cáo và nút bỏ qua

Bây giờ, hãy xác định hàm updateCustomUi() để điền thông tin quảng cáo vào giao diện người dùng. Các chi tiết sẽ khác nhau tuỳ theo định dạng quảng cáo, nhưng bạn thường bao gồm bộ đếm quảng cáo và nút bỏ qua hoặc bộ đếm bỏ qua nếu quảng cáo có thể bỏ qua. Thêm như sau:

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);
    }
}

Trong mã trên, sau khi kiểm tra xem có quảng cáo hay không và gọi Ad.isUiDisabled() để kiểm tra xem giao diện người dùng của quảng cáo mặc định đã tắt hay chưa, hãy gọi Ad.getAdPodInfo()AdsManager.getAdProgress() để tìm vị trí của quảng cáo trong nhóm và tiến trình của quảng cáo. Đối với quảng cáo có thể bỏ qua, hãy hiển thị bộ đếm bỏ qua nếu bạn chưa thể bỏ qua quảng cáo; nếu không, hãy hiển thị nút bỏ qua. Dưới đây là phần tóm tắt thông tin quảng cáo phổ biến và các lệnh gọi liên quan:

Thông tin Gọi
Quảng cáo hiện tại trong nhóm Ad.getAdPodInfo().getAdPosition()
Tổng số quảng cáo trong nhóm Ad.getPodInfo().getTotalAds()
Có thể bỏ qua quảng cáo Ad.isSkippable()
Số giây cho đến khi có thể bỏ qua quảng cáo Ad.getSkipTimeOffset() - AdsManager.getAdProgress().getCurrentTime()
Số giây còn lại trong quảng cáo (AdsManager.getAdProgress().getDuration() - AdsManager.getAdProgress().getCurrentTime()) * 1000

Thao tác nhấp vào nút Bỏ qua quảng cáo sẽ bỏ qua quảng cáo. Vì vậy, hãy thiết lập nút đó ngoài nút Tìm hiểu thêm:

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();
    }
});

Bạn phải tắt giao diện người dùng để AdsManager.clicked() hoạt động.

Khắc phục sự cố

Bạn có thẻ mẫu được bật để tắt giao diện người dùng của quảng cáo không?
Bạn có thể sao chép URL của thẻ mẫu này và dán vào phương thức triển khai IMA của mình.
Tôi không thể tắt giao diện người dùng mặc định.
Kiểm tra để đảm bảo rằng bạn gọi AdsRenderingSettings.setDisableUi() và truyền phương thức này đến AdsManager. Kiểm tra xem Ad.isUiDisabled() có trả về true hay không. Ngoài ra, bạn phải bật mạng trong Ad Manager để vô hiệu hoá giao diện người dùng của quảng cáo. Nếu bạn đã bật, VAST của bạn sẽ chứa Extension có dạng như sau:
<Extension type="uiSettings">
<UiHideable>1</UiHideable>
</Extension>
Nếu bạn vẫn gặp sự cố, hãy liên hệ với người quản lý tài khoản để xác nhận rằng bạn đã được bật. Một số loại quảng cáo yêu cầu một giao diện người dùng cụ thể; các quảng cáo này trả về với giá trị <UiHideable> là 0. Nếu bạn gặp phải trường hợp này, nhóm quản lý quảng cáo sẽ cần thay đổi để đảm bảo rằng các loại quảng cáo này không phân phát.