package com.weikou.beibeivideo.util.ad; import android.app.Activity; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.bytedance.sdk.openadsdk.AdSlot; import com.bytedance.sdk.openadsdk.TTAdConstant; import com.bytedance.sdk.openadsdk.TTAdDislike; import com.bytedance.sdk.openadsdk.TTAdManager; import com.bytedance.sdk.openadsdk.TTAdNative; import com.bytedance.sdk.openadsdk.TTNativeExpressAd; import com.huawei.hms.ads.AdListener; import com.huawei.hms.ads.AdParam; import com.huawei.hms.ads.AdSize; import com.huawei.hms.ads.nativead.DetailedCreativeType; import com.huawei.hms.ads.nativead.DislikeAdListener; import com.huawei.hms.ads.nativead.DislikeAdReason; import com.huawei.hms.ads.nativead.MediaView; import com.huawei.hms.ads.nativead.NativeAd; import com.huawei.hms.ads.nativead.NativeAdConfiguration; import com.huawei.hms.ads.nativead.NativeAdLoader; import com.huawei.hms.ads.nativead.NativeView; import com.qq.e.ads.cfg.VideoOption; import com.qq.e.ads.nativ.ADSize; import com.qq.e.ads.nativ.NativeExpressAD; import com.qq.e.ads.nativ.NativeExpressADView; import com.qq.e.comm.util.AdError; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.entity.ad.ExpressAdContainer; import com.weikou.beibeivideo.util.BeibeiConstant; import com.weikou.beibeivideo.util.DimenUtils; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 信息流广告管理 */ public class ExpressAdManager { public final static String POSITION_RECOMMEND = "recommend"; public final static String POSITION_SEARCH = "search"; public final static String POSITION_SEARCH_RESULT = "search_result"; public final static String POSITION_VIDEO_DETAIL_PLAYER_BOTTOM = "video_detail_player_bottom"; public final static String POSITION_EXIT = "exit"; final static String TAG = "ExpressAdManager"; AdUtil.AD_TYPE sourceType = AdUtil.AD_TYPE.gdt; private TTAdNative mTTAdNative; private Context mContext; private static Set closedAdPositions = new HashSet<>();// 是否已经关闭广告 private String positionName; public ExpressAdManager(AdUtil.AD_TYPE adSource, String positionName, Context context) { sourceType = adSource; this.mContext = context; if (sourceType == AdUtil.AD_TYPE.csj) { TTAdManager ttAdManager = null; try { ttAdManager = TTAdManagerHolder.get(); mTTAdNative = ttAdManager.createAdNative(context); } catch (Exception e) { e.printStackTrace(); } } this.positionName = positionName; } //加载小广告 /** * 加载广告 * * @param widthDP * @param heightDP * @param count * @param adLoadListener */ public void loadAd(int widthDP, int heightDP, String pid, int count, final IAdLoadListener adLoadListener) { if (closedAdPositions.contains(positionName)) { // 广告已经关闭 return; } if (sourceType == AdUtil.AD_TYPE.gdt || sourceType == AdUtil.AD_TYPE.gdt2) { loadGDT(pid, widthDP, heightDP, count, new IGDTAdLoadListener() { @Override public void onSuccess(List adList) { List adContainerList = new ArrayList<>(); if (adList != null) for (NativeExpressADView adView : adList) { adContainerList.add(new ExpressAdContainer(adView)); } adLoadListener.onSuccess(adContainerList); } }, mContext); } else if (sourceType == AdUtil.AD_TYPE.csj) { loadCSJ(pid, widthDP, heightDP, count, new ICSJAdLoadListener() { @Override public void onSuccess(List adList) { List adContainerList = new ArrayList<>(); if (adList != null) { for (TTNativeExpressAd adView : adList) { adContainerList.add(new ExpressAdContainer(adView)); } } adLoadListener.onSuccess(adContainerList); } }); } else if (sourceType == AdUtil.AD_TYPE.hw) { loadHW(pid, widthDP, heightDP, count, new IHWAdLoadListener() { @Override public void onSuccess(List adList) { List adContainerList = new ArrayList<>(); if (adList != null) { for (NativeAd ad : adList) { ExpressAdContainer adContainer = new ExpressAdContainer(); adContainer.setHwad(ad); adContainerList.add(adContainer); } } adLoadListener.onSuccess(adContainerList); } }); } } /** * 加载推荐大图广告 * * @param adLoadListener */ public void loadRecommendLargeAd(final IAdLoadListener adLoadListener) { //加载大图 int deviceWidth = DimenUtils.getScreenWidth(mContext); deviceWidth = DimenUtils.px2dip(mContext, deviceWidth); int width = deviceWidth - 9 * 2; int height = (int) (width * 0.8); String pid = null; if (sourceType == AdUtil.AD_TYPE.csj) { pid = CSJConstant.RECOMMEND_BIG_IMG_AD; height = (int) (width * 0.78); } else if (sourceType == AdUtil.AD_TYPE.gdt) { pid = BeibeiConstant.GDT_RECOMMAND_NATIVE; } else if (sourceType == AdUtil.AD_TYPE.gdt2) { pid = GDTConstant.PID_HOME_RECOMMEND_BIG_IMG; } else if (sourceType == AdUtil.AD_TYPE.hw) { pid = HuaWeiAdConstant.HW_AD_NATIVE_RECOMMEND_BIG; } //获取屏幕的宽 loadAd(width, height, pid, 1, adLoadListener); } /** * 视频播放器底部小广告 * * @param adLoadListener */ public void loadVideoDetailPlayerBottomAd(final IAdLoadListener adLoadListener) { if (sourceType == null) { return; } Log.i(TAG, "loadVideoDetailPlayerBottomAd"); //加载大图 String pid = null; if (sourceType == AdUtil.AD_TYPE.csj) { pid = CSJConstant.VIDEO_DETAIL_PLAYER_BOTTOM; } else if (sourceType == AdUtil.AD_TYPE.gdt2) { pid = GDTConstant.PID_2_VIDEO_DETAIL_PLAY_EXPRESS1; } else if (sourceType == AdUtil.AD_TYPE.hw) { pid = HuaWeiAdConstant.HW_AD_NATIVE_PLAYER_BOTTOM; } if (mContext == null) return; //获取屏幕的宽 int deviceWidth = DimenUtils.getScreenWidth(mContext); deviceWidth = DimenUtils.px2dip(mContext, deviceWidth); int width = (deviceWidth - 20); int height = 100; loadAd(width, height, pid, 1, adLoadListener); } /** * 相关推荐底部小广告 * * @param adLoadListener */ public void loadVideoDetailRelativeVideoBottomAd(final IAdLoadListener adLoadListener) { //加载大图 String pid = null; if (sourceType == AdUtil.AD_TYPE.csj) { pid = CSJConstant.VIDEO_DETAIL_GUESSLIKE_TOP; } else if (sourceType == AdUtil.AD_TYPE.gdt2) { pid = GDTConstant.PID_2_VIDEO_DETAIL_PLAY_EXPRESS2; } else if (sourceType == AdUtil.AD_TYPE.hw) { pid = HuaWeiAdConstant.HW_AD_NATIVE_PLAYER_BOTTOM; } if (mContext == null) return; //获取屏幕的宽 int deviceWidth = DimenUtils.getScreenWidth(mContext); deviceWidth = DimenUtils.px2dip(mContext, deviceWidth); int width = (deviceWidth - 20); int height = (int) (width * 0.5625); loadAd(width, height, pid, 1, adLoadListener); } /** * 搜索结果页小图 * * @param adLoadListener */ public void loadSearchResultSmallAd(int count, final IAdLoadListener adLoadListener) { //加载大图 String pid = null; if (sourceType == AdUtil.AD_TYPE.csj) { pid = "945379581"; } else if (sourceType == AdUtil.AD_TYPE.gdt2) { pid = BeibeiConstant.GDT_SEARCH_RESULT_MIN_NATIVE; } else if (sourceType == AdUtil.AD_TYPE.hw) { pid = HuaWeiAdConstant.HW_AD_NATIVE_SEARCH_RESULT; } //获取屏幕的宽 int deviceWidth = DimenUtils.getScreenWidth(mContext); deviceWidth = DimenUtils.px2dip(mContext, deviceWidth); int width = (deviceWidth - 20); int height = 75; loadAd(width, height, pid, count, adLoadListener); } /** * 加载APP退出广告 * * @param adLoadListener */ public void loadAppExitAd(final IAdLoadListener adLoadListener) { //加载大图 String pid = null; if (sourceType == AdUtil.AD_TYPE.csj) { pid = CSJConstant.APP_EXIT; } else if (sourceType == AdUtil.AD_TYPE.hw) { pid = HuaWeiAdConstant.HW_AD_NATIVE_EXIT_APP; } else { pid = GDTConstant.PID_2_EXIT; } //获取屏幕的宽 int deviceWidth = DimenUtils.getScreenWidth(mContext); deviceWidth = DimenUtils.px2dip(mContext, deviceWidth); int width = deviceWidth * 3 / 4; int height = (int) (width / 1.78f); loadAd(width, height, pid, 1, adLoadListener); } /** * 加载视频搜索广告 * * @param adLoadListener */ public void loadSearchAd(int widthDP, final IAdLoadListener adLoadListener) { //加载大图 String pid = null; int height = (int) (widthDP / 1.78f); if (sourceType == AdUtil.AD_TYPE.csj) { pid = CSJConstant.VIDEO_SEARCH; height = 0; } else if (sourceType == AdUtil.AD_TYPE.gdt2) { pid = BeibeiConstant.GDT_SEARCH_NATIVE; } else if (sourceType == AdUtil.AD_TYPE.hw) { pid = HuaWeiAdConstant.HW_AD_NATIVE_SEARCH; } loadAd(widthDP, height, pid, 1, adLoadListener); } /** * 加载广点通广告 * * @param positionId * @param count * @param adLoadListener * @param context */ private void loadGDT(String positionId, int widthDP, int heightDP, int count, final IGDTAdLoadListener adLoadListener, Context context) { NativeExpressAD nativeExpressAD = new NativeExpressAD(context, new ADSize(widthDP, ADSize.AUTO_HEIGHT), positionId, new NativeExpressAD.NativeExpressADListener() { @Override public void onADLoaded(List list) { if (adLoadListener != null) adLoadListener.onSuccess(list); } @Override public void onRenderFail(NativeExpressADView nativeExpressADView) { } @Override public void onRenderSuccess(NativeExpressADView nativeExpressADView) { } @Override public void onADExposure(NativeExpressADView nativeExpressADView) { } @Override public void onADClicked(NativeExpressADView nativeExpressADView) { } @Override public void onADClosed(NativeExpressADView nativeExpressADView) { } @Override public void onADLeftApplication(NativeExpressADView nativeExpressADView) { } @Override public void onNoAD(AdError adError) { if (adLoadListener != null) adLoadListener.onSuccess(null); } }); // 传入Activity nativeExpressAD.setVideoOption(new VideoOption.Builder() .setAutoPlayPolicy(VideoOption.AutoPlayPolicy.WIFI) // WIFI 环境下可以自动播放视频 .setAutoPlayMuted(true) // 自动播放时为静音 .build()); // nativeExpressAD.loadAD(count); } /** * 穿山甲广告 * * @param codeId * @param width * @param height * @param count * @param adLoadListener */ private void loadCSJ(String codeId, int width, int height, int count, final ICSJAdLoadListener adLoadListener) { count = count > 3 ? 3 : count; AdSlot adSlot = new AdSlot.Builder() .setCodeId(codeId) .setSupportDeepLink(true) .setExpressViewAcceptedSize(width, height) .setAdCount(count) //请求广告数量为1到3条 .build(); if (mTTAdNative == null) { if (adLoadListener != null) adLoadListener.onSuccess(null); return; } mTTAdNative.loadNativeExpressAd(adSlot, new TTAdNative.NativeExpressAdListener() { @Override public void onError(int i, String s) { adLoadListener.onSuccess(null); } @Override public void onNativeExpressAdLoad(List list) { adLoadListener.onSuccess(list); } }); } private static NativeView initHWNativeAdView(NativeAd nativeAd, Activity activity) { int createType = nativeAd.getCreativeType(); NativeView nativeView = null; if (createType == 2 || createType == 102) { // 大纯图片 nativeView = (NativeView) LayoutInflater.from(activity).inflate(R.layout.item_hw_ad_native_big, null); } else if (createType == 3 || createType == 6) { // 大纯图加文字或视频加文字 nativeView = (NativeView) LayoutInflater.from(activity).inflate(R.layout.item_hw_ad_native_big, null); } else if (createType == 103 || createType == 106) { // 大纯图加文字或视频加文字, 使用AppDownloadButton模板 nativeView = (NativeView) LayoutInflater.from(activity).inflate(R.layout.item_hw_ad_native_big, null); } else if (createType == 7 || createType == 107) { // 小纯图加文字 nativeView = (NativeView) LayoutInflater.from(activity).inflate(R.layout.item_hw_ad_native_small_pic, null); } else if (createType == 8 || createType == 108) { // 三个小纯图加文字 nativeView = (NativeView) LayoutInflater.from(activity).inflate(R.layout.item_hw_ad_native_3_small_pic, null); } else { // 未定义的创意类型 } if (nativeView == null) { return null; } // 注册和填充标题素材视图 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); return nativeView; } private void loadHW(String adId, int width, int height, int count, final IHWAdLoadListener adLoadListener) { NativeAdLoader.Builder builder = new NativeAdLoader.Builder(mContext, adId); // List detailedCreativeTypeList = new ArrayList<>(); NativeAdConfiguration adConfiguration = new NativeAdConfiguration.Builder() // .setAdSize(new AdSize(width, height)) .setMediaAspect(NativeAdConfiguration.MediaAspect.ASPECT_LANDSCAPE) // 是否要自定义“不再显示该广告”的功能 .setRequestCustomDislikeThisAd(true) // 设置原生广告是否返回多张图片素材,如果请求的创意类型是原生三小图,则需要设置此方法 .setRequestMultiImages(false) // 设置“为什么看到此广告”图标“i”或者“不再显示此广告”图标“x”的显示位置,如右下角 .setChoicesPosition(NativeAdConfiguration.ChoicesPosition.INVISIBLE) .build(); builder.setNativeAdOptions(adConfiguration); count = count > 3 ? 3 : count; final List adList = new ArrayList<>(); builder.setNativeAdLoadedListener(new NativeAd.NativeAdLoadedListener() { @Override public void onNativeAdLoaded(NativeAd nativeAd) { adList.add(nativeAd); } }).setAdListener(new AdListener() { @Override public void onAdLoaded() { super.onAdLoaded(); adLoadListener.onSuccess(adList); } @Override public void onAdFailed(int i) { super.onAdFailed(i); adList.clear(); adLoadListener.onSuccess(adList); } }); // 添加指定的创意类型:原生大图与原生视频 // detailedCreativeTypeList.add(DetailedCreativeType.BIG_IMG); // detailedCreativeTypeList.add(DetailedCreativeType.VIDEO); builder.build().loadAds(new AdParam.Builder().build(), count); } /** * 渲染模板和填充广告 * * @param activity * @param ad * @param fl_ad * @param adEventListener */ public static void renderAndFillAd(Activity activity, final ExpressAdContainer ad, final FrameLayout fl_ad, String positionName, final IAdEventListener adEventListener) { if (ad == null) {//广告为空 fl_ad.setVisibility(View.GONE); } else { fl_ad.setVisibility(View.VISIBLE); if (ad.getGdt() != null) { if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getGdt()) { return; } fl_ad.removeAllViews(); ad.getGdt().render(); if (ad.getGdt().getParent() != null) { ((ViewGroup) ad.getGdt().getParent()).removeAllViews(); } fl_ad.addView(ad.getGdt()); } else if (ad.getCsj() != null) { if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getCsj().getExpressAdView()) { return; } ad.getCsj().setDislikeCallback(activity, new TTAdDislike.DislikeInteractionCallback() { @Override public void onShow() { } @Override public void onSelected(int i, String s, boolean b) { if (adEventListener != null) { adEventListener.closeAd(ad); } closedAdPositions.add(positionName); } @Override public void onCancel() { } }); ad.getCsj().render(); if (ad.getCsj().getExpressAdView().getParent() != null) { ((ViewGroup) ad.getCsj().getExpressAdView().getParent()).removeAllViews(); } fl_ad.addView(ad.getCsj().getExpressAdView()); } else if (ad.getHwad() != null) { if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getHwView()) { return; } NativeView nativeView = initHWNativeAdView(ad.getHwad(), activity); ImageView iv_close = nativeView.findViewById(R.id.iv_close); if (iv_close != null) { iv_close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (adEventListener != null) { adEventListener.closeAd(ad); } closedAdPositions.add(positionName); } }); } ad.setHwView(nativeView); fl_ad.removeAllViews(); fl_ad.addView(nativeView); } } } /** * 渲染广告 * * @param activity * @param ad * @param adRenderListener * @param adEventListener */ public static void renderAd(Activity activity, final ExpressAdContainer ad, String positionName, final IAdRenderListener adRenderListener, final IAdEventListener adEventListener) { if (ad == null) {//广告为空 return; } if (ad.getGdt() != null) { ad.getGdt().render(); List list = new ArrayList<>(); list.add(ad); if (adRenderListener != null) adRenderListener.onRenderSuccess(list); } else if (ad.getCsj() != null) { Log.i(TAG, "广告曝光:csj"); ad.getCsj().setExpressInteractionListener(new TTNativeExpressAd.ExpressAdInteractionListener() { @Override public void onAdClicked(View view, int i) { } @Override public void onAdShow(View view, int i) { } @Override public void onRenderFail(View view, String s, int i) { List list = new ArrayList<>(); list.add(ad); if (adRenderListener != null) adRenderListener.onRenderFail(list); } @Override public void onRenderSuccess(View view, float v, float v1) { Log.d(TAG, "onRenderSuccess"); List list = new ArrayList<>(); list.add(ad); if (adRenderListener != null) adRenderListener.onRenderSuccess(list); } }); if (activity != null) ad.getCsj().setDislikeCallback(activity, new TTAdDislike.DislikeInteractionCallback() { @Override public void onShow() { } @Override public void onSelected(int i, String s, boolean b) { if (adEventListener != null) { adEventListener.closeAd(ad); } closedAdPositions.add(positionName); } @Override public void onCancel() { } }); ad.getCsj().render(); } else if (ad.getHwad() != null) { NativeView nativeView = initHWNativeAdView(ad.getHwad(), activity); ImageView iv_close = nativeView.findViewById(R.id.iv_close); if (iv_close != null) { iv_close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (adEventListener != null) { adEventListener.closeAd(ad); } closedAdPositions.add(positionName); } }); } ad.setHwView(nativeView); List list = new ArrayList<>(); list.add(ad); if (adRenderListener != null) adRenderListener.onRenderSuccess(list); } } /** * 为广告绑定关闭事件 * * @param activity * @param ad * @param adEventListener */ public static void bindCloseListener(Activity activity, final ExpressAdContainer ad, final IAdEventListener adEventListener) { if (ad == null) {//广告为空 return; } if (ad.getGdt() != null) { return; } else if (ad.getCsj() != null) { ad.getCsj().setExpressInteractionListener(new TTNativeExpressAd.ExpressAdInteractionListener() { @Override public void onAdClicked(View view, int i) { } @Override public void onAdShow(View view, int i) { } @Override public void onRenderFail(View view, String s, int i) { } @Override public void onRenderSuccess(View view, float v, float v1) { } }); ad.getCsj().setDislikeCallback(activity, new TTAdDislike.DislikeInteractionCallback() { @Override public void onShow() { } @Override public void onSelected(int i, String s, boolean b) { if (adEventListener != null) { adEventListener.closeAd(ad); } } @Override public void onCancel() { } }); } } /** * 填充广告 * * @param ad * @param fl_ad */ public static void fillAd(final ExpressAdContainer ad, final FrameLayout fl_ad) { fl_ad.post(new Runnable() { @Override public void run() { if (ad == null) {//广告为空 fl_ad.setVisibility(View.GONE); } else { fl_ad.setVisibility(View.VISIBLE); if (ad.getGdt() != null) { if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getGdt()) { return; } if (ad.getGdt().getParent() != null) { ((ViewGroup) ad.getGdt().getParent()).removeAllViews(); } fl_ad.removeAllViews(); fl_ad.addView(ad.getGdt()); } else if (ad.getCsj() != null) { if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getCsj().getExpressAdView()) { return; } if (ad.getCsj().getExpressAdView().getParent() != null) { ((ViewGroup) ad.getCsj().getExpressAdView().getParent()).removeAllViews(); } fl_ad.removeAllViews(); fl_ad.addView(ad.getCsj().getExpressAdView()); } else if (ad.getHwView() != null) { if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getHwView()) { return; } if (ad.getHwView().getParent() != null) { ((ViewGroup) ad.getHwView().getParent()).removeAllViews(); } fl_ad.removeAllViews(); fl_ad.addView(ad.getHwView()); } } if (fl_ad.getChildCount() > 0) { fl_ad.getChildAt(0).setVisibility(View.VISIBLE); fl_ad.getChildAt(0).post(new Runnable() { @Override public void run() { } }); } } }); } interface IGDTAdLoadListener { public void onSuccess(List adList); } interface ICSJAdLoadListener { public void onSuccess(List adList); } interface IHWAdLoadListener { public void onSuccess(List adList); } public interface IAdLoadListener { public void onSuccess(List adList); } public interface IAdRenderListener { public void onRenderSuccess(List adList); public void onRenderFail(List adList); } public interface IAdEventListener { public void closeAd(ExpressAdContainer ad); } public interface IAdShowListener { public void show(); } }