package com.weikou.beibeivideo.ui.ad; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.bytedance.sdk.openadsdk.AdSlot; import com.bytedance.sdk.openadsdk.TTAdConstant; import com.bytedance.sdk.openadsdk.TTAdNative; import com.bytedance.sdk.openadsdk.TTAdSdk; import com.bytedance.sdk.openadsdk.TTFeedAd; import com.qq.e.ads.cfg.VideoOption; import com.qq.e.ads.nativ.MediaView; import com.qq.e.ads.nativ.NativeADEventListener; import com.qq.e.ads.nativ.NativeADMediaListener; import com.qq.e.ads.nativ.NativeADUnifiedListener; import com.qq.e.ads.nativ.NativeUnifiedAD; import com.qq.e.ads.nativ.NativeUnifiedADData; import com.qq.e.ads.nativ.VideoPreloadListener; import com.qq.e.ads.nativ.widget.NativeAdContainer; import com.qq.e.comm.constants.AdPatternType; import com.qq.e.comm.util.AdError; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.entity.ad.AdPositionEnum; import com.weikou.beibeivideo.entity.ad.PlayVideoPreADSetting; import com.weikou.beibeivideo.util.BeibeiConstant; import com.weikou.beibeivideo.util.DimenUtils; import com.weikou.beibeivideo.util.ad.AdUtil; import com.weikou.beibeivideo.util.ad.CSJConstant; import com.weikou.beibeivideo.util.ad.DownloadConfirmHelper; import com.weikou.beibeivideo.util.downutil.StringUtils; import com.weikou.beibeivideo.util.ui.IPageEventListener; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; /** * 视频播放前贴广告 */ public class PlayVideoPreADFragment extends Fragment implements View.OnClickListener { private int AD_DURATION = 5; private final static String TAG = PlayVideoPreADFragment.class.getName(); private MediaView mediaView; private NativeAdContainer mContainer; //穿山甲广告 private FrameLayout fl_ad; private NativeUnifiedADData mGDTAdData; private LinearLayout ll_skip; private TextView tv_skip; private TextView tv_action; private View v_cutline; private ProgressBar pb_progress; private IPageEventListener pageEventListener; private IVideoAdListener videoAdListener; public static PlayVideoPreADFragment newInstance() { Bundle bundle = new Bundle(); PlayVideoPreADFragment fragment = new PlayVideoPreADFragment(); fragment.setArguments(bundle); return fragment; } public void setPageEventListener(IPageEventListener pageEventListener) { this.pageEventListener = pageEventListener; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { Log.i(TAG, "onCreate"); super.onCreate(savedInstanceState); } public void finishPlay() { if (videoAdListener != null) videoAdListener.finishPlay(); } private ImageView img_poster; private void initView(View root) { mediaView = root.findViewById(R.id.gdt_media_view); mContainer = root.findViewById(R.id.native_ad_container); img_poster = root.findViewById(R.id.img_poster); tv_skip = root.findViewById(R.id.tv_skip); ll_skip = root.findViewById(R.id.ll_skip); tv_action = root.findViewById(R.id.tv_action); v_cutline = root.findViewById(R.id.v_cutline); pb_progress = root.findViewById(R.id.pb_progress); fl_ad = root.findViewById(R.id.fl_ad); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { Bundle bundle = getArguments(); if (bundle != null) { AD_DURATION = bundle.getInt("skipDuration", 5); } View root = LayoutInflater.from(getContext()).inflate(R.layout.item_video_detail_ad, null); initView(root); tv_skip.setOnClickListener(this); if (pageEventListener != null) pageEventListener.onCreateView(); return root; } private Runnable timer = null; private synchronized void autoTimer(final View view) { if (timer == null) { timer = new Runnable() { @Override public void run() { if (remainTime - (mGDTAdData.getVideoCurrentPosition() / 1000) > 0) { tv_skip.setText((remainTime - (mGDTAdData.getVideoCurrentPosition() / 1000)) + "s后可跳过"); tv_skip.setClickable(false); } else { tv_skip.setText("跳过"); tv_skip.setClickable(true); } ll_skip.setVisibility(View.VISIBLE); autoTimer(view); } }; view.post(timer); } else { view.removeCallbacks(timer); view.postDelayed(timer, 1000); } } int remainTime = 0; Runnable playErrorRunnable = null; public void loadVideoAD(final IVideoAdListener videoAdListener) { loadVideoAD(videoAdListener, null); } public void loadVideoAD(IVideoAdListener videoAdListener, PlayVideoPreADSetting setting) { if (setting == null) setting = PlayVideoPreADSetting.PlayVideoPreADSettingFactory.createDefault(); Log.i(TAG, "loadVideoAD"); if (tv_skip == null) return; ll_skip.setVisibility(View.GONE); if (mGDTAdData != null) mGDTAdData.destroy(); pb_progress.setVisibility(View.VISIBLE); String pid = setting.getGdtPid(); //TODO 需要单独判断 if (AdUtil.getAdType(getContext(), AdPositionEnum.videoPlayPre) != AdUtil.AD_TYPE.gdt) pid = BeibeiConstant.GDT_DOWNLOAD_HINT_ID; tv_skip.setText(AD_DURATION + "s后可跳过"); ll_skip.setVisibility(View.GONE); if (!StringUtils.isNullOrEmpty(setting.getOtherAction())) { tv_action.setVisibility(View.VISIBLE); v_cutline.setVisibility(View.VISIBLE); tv_action.setText(setting.getOtherAction()); } else { tv_action.setVisibility(View.GONE); v_cutline.setVisibility(View.GONE); } tv_action.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (videoAdListener != null) videoAdListener.onOtherClick(tv_action.getText() + ""); } }); // loadCSJ(CSJConstant.PLAY_VIDEO_PRE, videoAdListener); loadGDT(pid, videoAdListener); } private StreamAdPlayer mStreamAdPlayer; /** * 加载穿山甲广告 * * @param code * @param videoAdListener */ private void loadCSJ(String code, IVideoAdListener videoAdListener) { fl_ad.setVisibility(View.VISIBLE); mContainer.setVisibility(View.GONE); TTAdNative mTTAdNative = TTAdSdk.getAdManager().createAdNative(getContext()); int width = DimenUtils.getScreenWidth(getContext()); int height = width * 9 / 16; AdSlot adSlot = new AdSlot.Builder() .setCodeId(code) .setSupportDeepLink(true) .setImageAcceptedSize(width, height) .setAdCount(1) .build(); mTTAdNative.loadStream(adSlot, new TTAdNative.FeedAdListener() { @Override public void onError(int i, String s) { Log.e(TAG, s); } @Override public void onFeedAdLoad(List ads) { if (ads == null || ads.isEmpty()) { return; } if (mStreamAdPlayer != null) { mStreamAdPlayer.clear(); } // 使用自定义播放器需要考虑为视频Url预加载 // 各家开发者的视频播放器个有不同 // 需要预加载请在通过ttFeedAd.getCustomVideo().getVideoUrl()拿到视频url之后自行预加载 mStreamAdPlayer = new StreamAdPlayer(ads, fl_ad); mStreamAdPlayer.play(); } }); } /** * 加载广点通广告 * * @param pid * @param videoAdListener */ private void loadGDT(String pid, IVideoAdListener videoAdListener) { Log.i(TAG, "loadGDT"); fl_ad.setVisibility(View.GONE); mContainer.setVisibility(View.VISIBLE); this.videoAdListener = videoAdListener; NativeUnifiedAD mAdManager = new NativeUnifiedAD(getContext(), pid, new NativeADUnifiedListener() { @Override public void onNoAD(AdError adError) {//没有广告 System.out.println(adError); pb_progress.setVisibility(View.GONE); if (videoAdListener != null) { videoAdListener.noAd(); } } @Override public void onADLoaded(List list) { Log.i(TAG, "onADLoaded"); final NativeUnifiedADData ad = list.get(0); ad.setDownloadConfirmListener(DownloadConfirmHelper.DOWNLOAD_CONFIRM_LISTENER); //填充内容 mGDTAdData = ad; List clickableViews = new ArrayList<>(); ad.bindAdToView(getContext(), mContainer, null, clickableViews); if (ad.getAdPatternType() == AdPatternType.NATIVE_VIDEO) { Log.d("gdt_ad_mob", "视频广告"); if (playErrorRunnable == null) playErrorRunnable = new Runnable() { @Override public void run() { if (pb_progress.getVisibility() == View.VISIBLE) { Log.i(TAG, "playErrorRunnable"); mGDTAdData.destroy(); if (videoAdListener != null) { videoAdListener.finishPlay(); } } } }; //4秒内视频还没加载完成的话就跳过 tv_skip.removeCallbacks(playErrorRunnable); tv_skip.postDelayed(playErrorRunnable, 10000); // 如果是视频广告,可以调用preloadVideo预加载视频素材 //展示广告 VideoOption videoOption = getVideoOption(); ad.bindMediaView(mediaView, videoOption, new NativeADMediaListener() { @Override public void onVideoInit() { Log.d(TAG, "onVideoInit: "); } @Override public void onVideoLoading() { Log.d(TAG, "onVideoLoading: "); } @Override public void onVideoReady() { Log.d(TAG, "onVideoReady"); img_poster.setVisibility(View.GONE); pb_progress.setVisibility(View.GONE); } @Override public void onVideoLoaded(int videoDuration) { Log.d(TAG, "onVideoLoaded: "); } @Override public void onVideoStart() { Log.d(TAG, "onVideoStart"); if (ad.getVideoDuration() / 1000 > AD_DURATION) remainTime = AD_DURATION; else remainTime = ad.getVideoDuration() / 1000; videoAdListener.startPlay(); autoTimer(img_poster); // img_poster.post(new Runnable() { // @Override // public void run() { // tv_skip.setVisibility(View.VISIBLE); // } // }); } @Override public void onVideoPause() { Log.d(TAG, "onVideoPause: "); } @Override public void onVideoResume() { Log.d(TAG, "onVideoResume: "); } @Override public void onVideoCompleted() { Log.d(TAG, "onVideoCompleted: "); ll_skip.setVisibility(View.GONE); if (videoAdListener != null) { videoAdListener.finishPlay(); } } @Override public void onVideoError(AdError error) { Log.d(TAG, "onVideoError: "); if (videoAdListener != null) { videoAdListener.finishPlay(); } } @Override public void onVideoStop() { Log.d(TAG, "onVideoStop"); } @Override public void onVideoClicked() { Log.d(TAG, "onVideoClicked"); } }); ad.setNativeAdEventListener(new NativeADEventListener() { @Override public void onADExposed() { Log.d(TAG, "onADExposed"); } @Override public void onADClicked() { Log.d(TAG, "onADClicked"); } @Override public void onADError(AdError adError) { Log.d(TAG, "onADError"); } @Override public void onADStatusChanged() { Log.d(TAG, "onADStatusChanged"); } }); ad.startVideo(); } else { pb_progress.setVisibility(View.GONE); if (videoAdListener != null) { videoAdListener.noAd(); } } } }); mAdManager.setVastClassName("com.qq.e.union.demo.adapter.vast.unified.ImaNativeDataAdapter"); mAdManager.loadData(1); tv_skip.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "点击跳过"); if (mGDTAdData != null) mGDTAdData.stopVideo(); if (videoAdListener != null) videoAdListener.finishPlay(); ll_skip.setVisibility(View.GONE); } }); } @Nullable public static VideoOption getVideoOption() { VideoOption.Builder builder = new VideoOption.Builder(); builder.setAutoPlayPolicy(VideoOption.AutoPlayPolicy.NEVER); builder.setAutoPlayMuted(false); builder.setDetailPageMuted(false); builder.setNeedCoverImage(true); builder.setNeedProgressBar(false); builder.setEnableDetailPage(true); builder.setEnableUserControl(false); return builder.build(); } @Override public void onResume() { Log.i(TAG, "onResume"); super.onResume(); if (mGDTAdData != null) { // 必须要在Activity.onResume()时通知到广告数据,以便重置广告恢复状态 mGDTAdData.resume(); } } @Override public void onDestroy() { super.onDestroy(); if (mGDTAdData != null) { // 必须要在Actiivty.destroy()时通知到广告数据,以便释放内存 mGDTAdData.destroy(); } if (img_poster != null && timer != null) img_poster.removeCallbacks(timer); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tv_skip: break; } } @Override public void onAttach(Context context) { super.onAttach(context); } public interface IVideoAdListener { //结束播放 public void finishPlay(); //没有广告填充 public void noAd(); //开始播放 public void startPlay(); //附加字段点击事件 public void onOtherClick(String name); } }