對於開發者來講,廣告是一種擁有流量便可變現的低門檻變現方式。但對於用戶來講,在使用App的過程當中,廣告數量過多,廣告內容劣質,很是影響用戶體驗,甚至形成用戶流失。那麼開發者如何才能兼得廣告變現和用戶體驗呢?使用原生廣告就是很好的解決方法之一。java
什麼是原生廣告
原生廣告是建立與應用內容融於一體的廣告形式,包含圖片、文字和視頻。原生廣告將廣告內容做爲信息或服務內容的一部分植入到應用設計中,常見於信息流場景。android
原生廣告的優點
原生廣告可讓廣告在應用中看起來更天然。和Banner廣告相比,原生廣告對用戶注意力影響較小,讓用戶有渾然一體的觀看體驗,減小廣告對用戶的干擾。git
原生廣告支持自定義界面,與其餘廣告格式相比,如何在App中展現廣告方面,原生廣告具備更高的靈活性,可讓廣告主展現更多的廣告內容。github
原生廣告支持自由定製界面,可讓用戶在App中得到更好的廣告體驗,而且能夠幫助開發者提升從廣告中得到的收益。所以,若是開發者既想經過廣告提升收益,又想盡量減小廣告對用戶體驗的影響,不妨考慮使用原生廣告。華爲廣告服務可以幫助開發者接入包括原生廣告在內的6種廣告位,接下來的文章會詳細講解開發步驟。網絡
示例代碼已在相關社區進行開源,歡迎開發者關注、下載並提供寶貴意見:app
Github官方地址:https://github.com/hms-core/hms-ads-demo-javaide
Gitee官方地址:https://gitee.com/hms-core/hms-ads-demo-java佈局
前提條件
HUAWEI Ads SDK依賴HMS Core(APK)4.0.0.300及以上版本。若是設備上未安裝HMS Core(APK)4.0.0.300及以上版本,則沒法使用HUAWEI Ads SDK的相關接口。
在開發應用前須要在華爲開發者聯盟網站上註冊成爲開發者並完成實名認證,具體方法可參見賬號註冊認證。
參見建立項目和在項目中添加應用完成應用的建立。測試
開發前準備
廣告服務的集成需以下4個關鍵步驟,能夠參考華爲開發者聯盟文檔
1. 導入HUAWEI Ads SDK
2. 配置網絡權限
3. 配置混淆腳本
4. 初始化SDK網站
開發關鍵步驟
原生廣告須要經過NativeAdLoader類獲取。
1.1 構建NativeAdLoader
NativeAdLoader類提供了NativeAdLoader.Builder類,可用於設置廣告位ID、設置自定義選項和構建NativeAdLoader對象。
// "testy63txaom86"爲測試專用的廣告位ID,App正式發佈時須要改成正式的廣告位ID NativeAdLoader.Builder builder = new NativeAdLoader.Builder(this, "testy63txaom86"); builder.setNativeAdLoadedListener(new NativeAd.NativeAdLoadedListener() { @Override public void onNativeAdLoaded(NativeAd nativeAd) { // 廣告獲取完成後調用 ... } }).setAdListener(new AdListener() { @Override public void onAdFailed(int errorCode) { // 廣告獲取失敗時調用 ... } }); NativeAdLoader nativeAdLoader = builder.build();
當獲取廣告成功後,SDK會調用NativeAd.NativeAdLoadedListener監聽器的onNativeAdLoaded()方法返回NativeAd對象。當獲取廣告失敗後,SDK會調用AdListener監聽器的onAdFailed()方法。
1.2 獲取廣告
NativeAdLoader提供loadAd()和loadAds()的兩種方法獲取廣告。
- loadAd()請求單個原生廣告:AdParam是惟一的參數。調用loadAd()後,SDK將對添加的監聽器方法進行一次成功或失敗的回調。
nativeAdLoader.loadAd(new AdParam.Builder().build());
- loadAd()請求指定創意類型的原生廣告:AdParam.Builder提供了setDetailedCreativeTypeList接口,支持傳入請求的創意類型。
List<Integer> detailedCreativeTypeList = new ArrayList<>(); // 添加指定的創意類型:原生大圖 detailedCreativeTypeList.add(DetailedCreativeType.BIG_IMG); AdParam.Builder adRequestBuilder = new AdParam.Builder(); adRequestBuilder.setDetailedCreativeTypeList(detailedCreativeTypeList); nativeAdLoader.loadAd(adRequestBuilder.build());
- loadAds()請求多個原生廣告:loadAds()請求有兩個參數,除AdParam外,還有請求加載的最大廣告數量爲5。SDK返回的廣告數量將會小於等於所請求的廣告數量,而且廣告皆不相同。
nativeAdLoader.loadAds(new AdParam.Builder().build(), 5);
當獲取廣告成功後,SDK會屢次調用NativeAd.NativeAdLoadedListener監聽器的onNativeAdLoaded()方法分別返回一個NativeAd對象,在廣告都返回後再調用AdListener監聽器的onAdLoded()方法回調通知這次請求成功;當獲取廣告失敗後,SDK會調用AdListener監聽器的onAdFailed()方法。
// "testy63txaom86"爲測試專用的廣告位ID,App正式發佈時須要改成正式的廣告位ID NativeAdLoader.Builder builder = new NativeAdLoader.Builder(this, "testy63txaom86"); NativeAdLoader nativeAdLoader = builder.setNativeAdLoadedListener(new NativeAd.NativeAdLoadedListener() { @Override public void onNativeAdLoaded(NativeAd nativeAd) { // 廣告加載成功回調,多個廣告對應多個回調 ... } }).setAdListener(new AdListener() { @Override public void onAdLoaded() { // 廣告加載完成回調,說明這次廣告加載成功,並且全部廣告都已回調完成。 ... } @Override public void onAdFailed(int errorCode) { // 廣告加載失敗 ... } }).build(); nativeAdLoader.loadAds(new AdParam.Builder().build(), 5);
1.3 展現原生廣告
獲取到廣告後在監聽器的回調方法中展現原生廣告,須要在每一個廣告視圖的一角展現「爲何看到此廣告」的圖標「i」或「再也不顯示該廣告」的圖標「x」,而且必須展現廣告標識。
如下是展現原生廣告的步驟:
- 定義原生廣告佈局
須要自定義一個佈局用於展現NativeAd中的素材
<com.huawei.hms.ads.nativead.NativeView xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" ... > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" ... > <!-- 多媒體視圖 --> <com.huawei.hms.ads.nativead.MediaView android:id="@+id/ad_media" android:layout_width="75dp" android:layout_height="50dp" ... /> <RelativeLayout ... > <TextView android:id="@+id/ad_title" android:layout_width="match_parent" android:layout_height="34dp" ... /> <!-- 其餘素材 --> ... </RelativeLayout> <!-- 其餘素材 --> ... </RelativeLayout> </com.huawei.hms.ads.nativead.NativeView>
- 註冊和填充素材視圖
獲取到NativeView對象後,須要註冊和填充素材。
private void initNativeAdView(NativeAd nativeAd, NativeView nativeView) { // 註冊和填充標題素材視圖 nativeView.setTitleView(nativeView.findViewById(R.id.ad_title)); ((TextView) nativeView.getTitleView()).setText(nativeAd.getTitle()); // 註冊和填充多媒體素材視圖 nativeView.setMediaView((MediaView) nativeView.findViewById(R.id.ad_media)); nativeView.getMediaView().setMediaContent(nativeAd.getMediaContent()); // 註冊和填充其餘素材視圖 nativeView.setAdSourceView(nativeView.findViewById(R.id.ad_source)); nativeView.setCallToActionView(nativeView.findViewById(R.id.ad_call_to_action)); if (null != nativeAd.getAdSource()) { ((TextView) nativeView.getAdSourceView()).setText(nativeAd.getAdSource()); } nativeView.getAdSourceView() .setVisibility(null != nativeAd.getAdSource() ? View.VISIBLE : View.INVISIBLE); if (null != nativeAd.getCallToAction()) { ((Button) nativeView.getCallToActionView()).setText(nativeAd.getCallToAction()); } nativeView.getCallToActionView() .setVisibility(null != nativeAd.getCallToAction() ? View.VISIBLE : View.INVISIBLE); // 註冊原生廣告對象 nativeView.setNativeAd(nativeAd); }
依次設置其餘要展現的廣告素材。
MediaView用於展現多媒體素材。若是獲取的廣告含有視頻素材,則視頻會在MediaView內播放。不然MediaView會顯示一個圖片素材。
- 向NativeView註冊原生廣告對象
nativeView.setNativeAd(nativeAd);
- 展現NativeView
private void loadAd() { NativeAdLoader.Builder builder = new NativeAdLoader.Builder(this, "testy63txaom86"); builder.setNativeAdLoadedListener(new NativeAd.NativeAdLoadedListener() { @Override public void onNativeAdLoaded(NativeAd nativeAd) { ... // 獲取NativeView視圖 NativeView nativeView = (NativeView) getLayoutInflater().inflate(R.layout.ad_native, null); // 註冊和填充原生廣告素材視圖 initNativeAdView(nativeAd, nativeView); // 將NativeView添加到界面 FrameLayout adFrameLayout = findViewById(R.id.frame_layout_ad); adFrameLayout.removeAllViews(); adFrameLayout.addView(nativeView); ... } }); ... } private void initNativeAdView(NativeAd nativeAd, NativeView nativeView) { // 註冊和填充標題素材視圖 nativeView.setTitleView(nativeView.findViewById(R.id.ad_title)); ((TextView) nativeView.getTitleView()).setText(nativeAd.getTitle()); // 註冊和填充多媒體素材視圖 nativeView.setMediaView((MediaView) nativeView.findViewById(R.id.ad_media)); nativeView.getMediaView().setMediaContent(nativeAd.getMediaContent()); // 註冊和填充其餘素材視圖 ... // 註冊原生廣告對象 nativeView.setNativeAd(nativeAd); }
1.4 監聽廣告事件
NativeAdLoader nativeAdLoader = builder.setAdListener(new AdListener() { @Override public void onAdClicked() { // 廣告點擊時調用 ... } ... }).build();
1.5 銷燬廣告
nativeAd.destroy()
>>訪問華爲廣告服務官網,瞭解更多相關內容
>>獲取華爲廣告服務開發指導文檔
>>華爲移動服務開源倉庫地址:GitHub、Gitee
點擊右上角頭像右方的關注,第一時間瞭解華爲移動服務最新技術~