package com.yeshi.base.utils.ad; import android.app.Activity; import android.content.Context; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import com.bytedance.sdk.openadsdk.AdSlot; 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.lcjian.library.util.common.DimenUtils; 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.ads.nativ.express2.AdEventListener; import com.qq.e.ads.nativ.express2.NativeExpressAD2; import com.qq.e.ads.nativ.express2.NativeExpressADData2; import com.qq.e.ads.nativ.express2.VideoOption2; import com.qq.e.comm.util.AdError; import com.yeshi.base.entity.ad.ExpressAdContainer; import java.util.ArrayList; import java.util.List; /** * 信息流广告管理 */ public class ExpressAdManager { final static String TAG = "ExpressAdManager"; AdUtil.AD_TYPE sourceType = AdUtil.AD_TYPE.gdt; private TTAdNative mTTAdNative; private Context mContext; public ExpressAdManager(AdUtil.AD_TYPE adSource, Context context) { sourceType = adSource; this.mContext = context; if (sourceType == AdUtil.AD_TYPE.csj) { TTAdManager ttAdManager = TTAdManagerHolder.get(); mTTAdNative = ttAdManager.createAdNative(context); // TTAdManagerHolder.get().requestPermissionIfNecessary(context); } } public AdUtil.AD_TYPE getSourceType() { return sourceType; } //加载小广告 /** * 加载广告 * * @param widthDP * @param heightDP * @param count * @param adLoadListener */ public void loadAd(int widthDP, int heightDP, String pid, int count, final IAdLoadListener adLoadListener) { if (sourceType == AdUtil.AD_TYPE.gdt) { 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); } @Override public void onSuccess2(List adList) { } }, mContext); } else if (sourceType == AdUtil.AD_TYPE.gdt2) { loadGDT2(pid, widthDP, heightDP, count, new IGDTAdLoadListener() { @Override public void onSuccess(List adList) { } @Override public void onSuccess2(List adList) { List adContainerList = new ArrayList<>(); if (adList != null) for (NativeExpressADData2 ad : adList) { adContainerList.add(new ExpressAdContainer(ad)); } 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); } }); } } /** * 加载广点通广告 * * @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(ADSize.FULL_WIDTH, 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 onADOpenOverlay(NativeExpressADView nativeExpressADView) { } @Override public void onADCloseOverlay(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.setVideoPlayPolicy(VideoOption.VideoPlayPolicy.AUTO); nativeExpressAD.loadAD(count); } /** * 2.0版本广点通原生 * * @param positionId * @param widthDP * @param heightDP * @param count * @param adLoadListener * @param context */ private void loadGDT2(String positionId, int widthDP, int heightDP, int count, final IGDTAdLoadListener adLoadListener, Context context) { Log.i(TAG, String.format("loadGDT2:positionId-%s widthDP-%s heightDP-%s", positionId, widthDP, heightDP)); NativeExpressAD2 nativeExpressAD2 = new NativeExpressAD2(context, positionId, new NativeExpressAD2.AdLoadListener() { @Override public void onLoadSuccess(List list) { if (adLoadListener != null) adLoadListener.onSuccess2(list); } @Override public void onNoAD(AdError adError) { if (adLoadListener != null) adLoadListener.onSuccess2(null); } }); nativeExpressAD2.setAdSize(widthDP, heightDP); VideoOption2.Builder builder = new VideoOption2.Builder(); builder.setAutoPlayPolicy(VideoOption2.AutoPlayPolicy.WIFI) // WIFI 环境下可以自动播放视频 .setAutoPlayMuted(true) // 自动播放时为静音 .setDetailPageMuted(false) // 视频详情页播放时不静音 .setMaxVideoDuration(0) // 设置返回视频广告的最大视频时长(闭区间,可单独设置),单位:秒,默认为 0 代表无限制,合法输入为:5<=maxVideoDuration<=60. 此设置会影响广告填充,请谨慎设置 .setMinVideoDuration(0); // 设置返回视频广告的最小视频时长(闭区间,可单独设置),单位:秒,默认为 0 代表无限制, 此设置会影响广告填充,请谨慎设置 nativeExpressAD2.setVideoOption2(builder.build()); nativeExpressAD2.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(); 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); } }); } /** * 渲染模板和填充广告 * * @param activity * @param ad * @param fl_ad * @param adEventListener */ public static void renderAndFillAd(Activity activity, final ExpressAdContainer ad, final FrameLayout fl_ad, 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.getGdt2() != null) { if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getGdt2().getAdView()) { return; } fl_ad.removeAllViews(); ad.getGdt2().setAdEventListener(new AdEventListener() { @Override public void onClick() { } @Override public void onExposed() { } @Override public void onRenderSuccess() { try { if (ad.getGdt2().getAdView().getParent() != null) { ((ViewGroup) ad.getGdt2().getAdView().getParent()).removeAllViews(); } fl_ad.addView(ad.getGdt2().getAdView()); } catch (Exception e) { } } @Override public void onRenderFail() { } @Override public void onAdClosed() { if (adEventListener != null) { adEventListener.closeAd(ad); } } }); ad.getGdt2().render(); } 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 onSelected(int i, String s) { if (adEventListener != null) { adEventListener.closeAd(ad); } } @Override public void onCancel() { } @Override public void onRefuse() { } }); ad.getCsj().render(); if (ad.getCsj().getExpressAdView().getParent() != null) { ((ViewGroup) ad.getCsj().getExpressAdView().getParent()).removeAllViews(); } fl_ad.addView(ad.getCsj().getExpressAdView()); } } } /** * 渲染广告 * * @param activity * @param ad * @param adRenderListener * @param adEventListener */ public static void renderAd(Activity activity, final ExpressAdContainer ad, 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.getGdt2() != null) { ad.getGdt2().setAdEventListener(new AdEventListener() { @Override public void onClick() { } @Override public void onExposed() { } @Override public void onRenderSuccess() { List list = new ArrayList<>(); list.add(ad); if (adRenderListener != null) adRenderListener.onRenderSuccess(list); } @Override public void onRenderFail() { List list = new ArrayList<>(); list.add(ad); if (adRenderListener != null) adRenderListener.onRenderFail(list); } @Override public void onAdClosed() { if (adEventListener != null) adEventListener.closeAd(ad); } }); ad.getGdt2().render(); } 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) { 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 onSelected(int i, String s) { if (adEventListener != null) { adEventListener.closeAd(ad); } } @Override public void onCancel() { } @Override public void onRefuse() { } }); ad.getCsj().render(); } } /** * 为广告绑定关闭事件 * * @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.getGdt2() != null) { ad.getGdt2().setAdEventListener(new AdEventListener() { @Override public void onClick() { } @Override public void onExposed() { } @Override public void onRenderSuccess() { } @Override public void onRenderFail() { } @Override public void onAdClosed() { if (adEventListener != null) adEventListener.closeAd(ad); } }); } 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 onSelected(int i, String s) { if (adEventListener != null) { adEventListener.closeAd(ad); } } @Override public void onCancel() { } @Override public void onRefuse() { } }); } } /** * 填充广告 * * @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.getGdt2() != null) { if (fl_ad.getChildCount() > 0 && fl_ad.getChildAt(0) == ad.getGdt2().getAdView()) { return; } if (ad.getGdt2().getAdView().getParent() != null) { ((ViewGroup) ad.getGdt2().getAdView().getParent()).removeAllViews(); } fl_ad.removeAllViews(); fl_ad.addView(ad.getGdt2().getAdView()); } 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()); } } 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); public void onSuccess2(List adList); } interface ICSJAdLoadListener { 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(); } }