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<TTFeedAd> 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<NativeUnifiedADData> list) {
|
Log.i(TAG, "onADLoaded");
|
final NativeUnifiedADData ad = list.get(0);
|
ad.setDownloadConfirmListener(DownloadConfirmHelper.DOWNLOAD_CONFIRM_LISTENER);
|
//填充内容
|
mGDTAdData = ad;
|
List<View> 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);
|
|
}
|
|
|
}
|