admin
2020-10-15 cd89367a01870afb5c1e818895abb03ffea42d88
BuWanVideo/src/com/weikou/beibeivideo/ui/video/FunshionPlayerFragment.java
@@ -11,8 +11,10 @@
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
@@ -22,6 +24,7 @@
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.androidquery.AQuery;
@@ -128,6 +131,9 @@
    private MediaPlayer mediaPlayer;
    //展示广告
    private boolean mShowAd = false;
    public void setPageEventListener(IPageEventListener pageEventListener) {
        this.pageEventListener = pageEventListener;
    }
@@ -137,6 +143,7 @@
    public int getContentResource() {
        return R.layout.fragment_player_funshion;
    }
    private void initPlayer() {
        mVideoSurfView.getHolder().addCallback(mVideoSurfaceViewCallBack);
@@ -164,7 +171,18 @@
        fssrFeedAdLoader = new FSSRFeedAdLoader(getContext(), FunshionConstant.AD_CHANNEL);
    }
    private void loadAD() {
    /**
     * 加载广告
     *
     * @param iadLoadListener
     */
    private synchronized void loadAD(IADLoadListener iadLoadListener) {
        if (!mShowAd) {
            iadLoadListener.finishAd();
            return;
        }
        fl_ad.setVisibility(View.VISIBLE);
        String adid = "bfys_a_qt";
        int width = fl_ad.getWidth();
        int height = fl_ad.getHeight();
@@ -188,11 +206,11 @@
                FSSRAdData fsad = fsADView.getFSAd();
                if (null != gdtad) {
                    //广点通数据自渲染
                    initGDTSelfRenderView(fsADView, gdtad);
                    initGDTSelfRenderView(fsADView, gdtad, iadLoadListener);
                }
                if (null != fsad) {
                    //风行数据自渲染
                    initFSSelfRenderView(fsADView, fsad);
                    initFSSelfRenderView(fsADView, fsad,iadLoadListener);
                }
                if (fsADView.getParent() != null) {
                    ((ViewGroup) fsADView.getParent()).removeAllViews();
@@ -216,7 +234,7 @@
    }
    private void initFSSelfRenderView(final FSFeedAD fsADView, FSSRAdData fsad) {
    private void initFSSelfRenderView(final FSFeedAD fsADView, FSSRAdData fsad,IADLoadListener iadLoadListener) {
        if (fsad.isImage()) {
            ImageView imageView = new ImageView(getContext());
            Glide.with(this).load(fsad.getMaterial()).into(imageView);
@@ -225,7 +243,62 @@
            fsADView.bindAdToView(imageView, clickableViews, null);
        } else if (fsad.isVideo()) {
            MediaView mediaView = new MediaView(getContext());
            fsADView.bindMediaView(mediaView, null, null);
            fsADView.bindMediaView(mediaView, null, new NativeADMediaListener() {
                @Override
                public void onVideoClicked() {
                }
                @Override
                public void onVideoCompleted() {
                    iadLoadListener.finishAd();
                }
                @Override
                public void onVideoError(AdError adError) {
                    iadLoadListener.finishAd();
                }
                @Override
                public void onVideoInit() {
                }
                @Override
                public void onVideoLoaded(int i) {
                }
                @Override
                public void onVideoLoading() {
                }
                @Override
                public void onVideoPause() {
                }
                @Override
                public void onVideoReady() {
                }
                @Override
                public void onVideoResume() {
                }
                @Override
                public void onVideoStart() {
                }
                @Override
                public void onVideoStop() {
                }
            });
            final Button button = new Button(getContext());
            button.setText("打开声音");
@@ -242,6 +315,7 @@
                }
            });
            List<View> clickableViews = new ArrayList<>();
            clickableViews.add(mediaView);
            fsADView.bindAdToView(button, clickableViews, null);
        }
    }
@@ -253,17 +327,72 @@
    protected MediaView mMediaView;
    protected ImageView mImagePoster;
    protected LinearLayout mNative3imgAdContainer;
    private TextView tv_skip;//跳过
    private LayoutInflater mLayoutInflater;
    private NativeUnifiedADData gdtAd = null;
    int totalTime = 0;
    private Runnable timer = null;
    private synchronized void autoTimer(final View view) {
        if (timer == null) {
            timer = new Runnable() {
                @Override
                public void run() {
                    Log.i(TAG, "autoTimer:" + (remainTime - (gdtAd.getVideoCurrentPosition() / 1000)));
                    if (remainTime - (gdtAd.getVideoCurrentPosition() / 1000) > 0) {
                        tv_skip.setText((remainTime - (gdtAd.getVideoCurrentPosition() / 1000)) + "s后可跳过");
                        tv_skip.setClickable(false);
                    } else {
                        tv_skip.setText("跳过");
                        tv_skip.setClickable(true);
                    }
                    autoTimer(view);
                }
            };
            view.postDelayed(timer, 1000);
        } else {
            view.removeCallbacks(timer);
            view.postDelayed(timer, 1000);
        }
    }
    int remainTime = 0;
    //广告播放出错
    Runnable playADErrorRunnable = new Runnable() {
        @Override
        public void run() {
            if (gdtAd != null) {
                gdtAd.destroy();
                adShowFinish(playInfo);
            }
        }
    };
    //自渲染view
    private void initGDTSelfRenderView(FSFeedAD fsADView, NativeUnifiedADData ad) {
    private void initGDTSelfRenderView(FSFeedAD fsADView, NativeUnifiedADData ad, IADLoadListener iadLoadListener) {
        if (mLayoutInflater == null)
            return;
        gdtAd = ad;
        View mContainer = getLayoutInflater().inflate(R.layout.sr_gdt_ad_view, null);
        final View mContainer = mLayoutInflater.inflate(R.layout.sr_gdt_ad_view, null);
        mDownloadButton = mContainer.findViewById(R.id.btn_download);
        mMediaView = mContainer.findViewById(R.id.gdt_media_view);
        mImagePoster = mContainer.findViewById(R.id.img_poster);
        mNative3imgAdContainer = mContainer.findViewById(R.id.native_3img_ad_container);
        tv_skip = mContainer.findViewById(R.id.tv_skip);
        tv_skip.setVisibility(View.GONE);
        tv_skip.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                iadLoadListener.finishAd();
            }
        });
        mAQuery = new AQuery(mContainer);
        int patternType = ad.getAdPatternType();
        if (patternType == AdPatternType.NATIVE_VIDEO) {
@@ -274,7 +403,6 @@
                params.height = FrameLayout.LayoutParams.MATCH_PARENT;
            }
            mContainer.setLayoutParams(params);
        }
        if (patternType == AdPatternType.NATIVE_2IMAGE_2TEXT
                || patternType == AdPatternType.NATIVE_VIDEO) {
@@ -335,6 +463,10 @@
                }
            });
            //4秒内视频还没加载完成的话就跳过
            tv_skip.removeCallbacks(playADErrorRunnable);
            tv_skip.postDelayed(playADErrorRunnable, 4000);
            VideoOption.Builder builder = new VideoOption.Builder();
            builder.setAutoPlayPolicy(VideoOption.AutoPlayPolicy.ALWAYS);
@@ -364,11 +496,25 @@
                @Override
                public void onVideoLoaded(int videoDuration) {
                    Log.d(TAG, "onVideoLoaded: ");
                    tv_skip.removeCallbacks(playADErrorRunnable);
                }
                @Override
                public void onVideoStart() {
                    Log.d(TAG, "onVideoStart");
                    Log.d(TAG, "onVideoStart");
                    if (ad.getVideoDuration() / 1000 > 5)
                        remainTime = 5;
                    else
                        remainTime = ad.getVideoDuration() / 1000;
                    autoTimer(mContainer);
                    mContainer.post(new Runnable() {
                        @Override
                        public void run() {
                            tv_skip.setVisibility(View.VISIBLE);
                        }
                    });
                }
                @Override
@@ -394,12 +540,12 @@
                @Override
                public void onVideoCompleted() {
                    Log.d(TAG, "onVideoCompleted: ");
                    adShowFinish();
                    iadLoadListener.finishAd();
                }
                @Override
                public void onVideoError(AdError error) {
                    iadLoadListener.finishAd();
                }
            });
@@ -417,7 +563,7 @@
    //广告展示完成
    private void adShowFinish() {
    private void adShowFinish(FunshionPlayInfo info) {
        fl_ad.setVisibility(View.GONE);
        fl_ad.removeAllViews();
        mFSVideoAD = null;
@@ -425,7 +571,11 @@
        mVideoSurfView.postDelayed(new Runnable() {
            @Override
            public void run() {
                EventBus.getDefault().post(playInfo);
                //播放视频
                if (!StringUtils.isNullOrEmpty(info.getPlayUrl().getAid()))
                    playMedia(info.getPlayUrl().getAid(), (info.getPosition() + 1) + "");
                else
                    playVideo(info.getPlayUrl().getVid());
            }
        }, 1000);
    }
@@ -436,6 +586,7 @@
        rl_container = view.findViewById(R.id.rl_container);
        fl_container = view.findViewById(R.id.fl_container);
        fl_ad = view.findViewById(R.id.fl_ad);
        mLayoutInflater = LayoutInflater.from(getContext());
    }
    //创建广播接受者对象
@@ -455,14 +606,8 @@
        getContext().registerReceiver(batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        getContext().registerReceiver(networkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
        initAd();
        fl_ad.setVisibility(View.VISIBLE);
        fl_ad.post(new Runnable() {
            @Override
            public void run() {
                loadAD();
            }
        });
        mShowAd = true;
        onEventMainThread(playInfo);
    }
    @Override
@@ -589,10 +734,7 @@
            VideoDefinition vdf = new VideoDefinition();
            vdf.setClarity(mCurrDefinition.getStringDefinition());
            vdf.setName(getDefinitionName(mCurrDefinition.getStringDefinition()));
            vpc_funshion.setDefinition(vdfList, vdf);
            Toast.makeText(BeibeiVideoApplication.application, "当前清晰度:" + currDefinition.getStringDefinition(), Toast.LENGTH_LONG).show();
        }
        @Override
@@ -634,9 +776,11 @@
            isReady = false;
            Log.d(TAG, "surfaceDestroyed");
            if (mVideoPlayer.isPlaying()) {
            if (mVideoPlayer != null) {
                position = mVideoPlayer.getCurrentPosition();
                Log.d(TAG, "当前播放时间:" + position);
            }
            if (mVideoPlayer.isPlaying()) {
                mVideoPlayer.stop();
            }
        }
@@ -653,8 +797,8 @@
                    mVideoPlayer.prepare();
                    if (position > 0)
                        mVideoPlayer.seekTo(position);
                    position = -1;
                    Log.d(TAG, "续播时间:" + position);
                    position = -1;
                } catch (IOException e) {
                    e.printStackTrace();
                }
@@ -729,7 +873,8 @@
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            mFunshionIVideoPlayer.onMediaPlayerError(what, extra);
            if (mFunshionIVideoPlayer != null)
                mFunshionIVideoPlayer.onMediaPlayerError(what, extra);
            return false;
        }
    };
@@ -741,14 +886,15 @@
    @Override
    public void onDestroy() {
        super.onDestroy();
        stopPlay();
        if (tv_skip != null)
            tv_skip.setVisibility(View.GONE);
        if (mFunshionIVideoPlayer != null) {
            mFunshionIVideoPlayer.onActivityDestroy();
            mFunshionIVideoPlayer.release();
        }
        mLayoutInflater = null;
        super.onDestroy();
    }
    @Override
@@ -761,7 +907,6 @@
        super.onStop();
        if (mVideoPlayer != null && mVideoPlayer.isPlaying())
            mVideoPlayer.pause();
    }
    @Override
@@ -774,6 +919,8 @@
            gdtAd.resumeVideo();
            gdtAd.startVideo();
        }
        vpc_funshion.onResume();
    }
    @Override
@@ -784,6 +931,7 @@
        if (mFunshionIVideoPlayer != null)
            mFunshionIVideoPlayer.onActivityPause();
        EventBus.getDefault().unregister(this);
        vpc_funshion.onPause();
    }
@@ -829,21 +977,35 @@
    public void onEventMainThread(FunshionPlayInfo info) {
        Log.i(TAG, "onEventMainThread:FunshionPlayInfo");
        mCurrentPosition = info.getPosition();
        List<VideoEpisode> episodes = new ArrayList<>();
        for (int i = 0; i < info.getVideoInfo().getVideoDetailList().size(); i++) {
            VideoDetailInfo detail = info.getVideoInfo().getVideoDetailList().get(i);
            VideoEpisode es = new VideoEpisode();
            es.setId(detail.getId());
            es.setTag(detail.getTag());
            es.setName(detail.getName());
            es.setVideoId(info.getVideoInfo().getId());
            if (mCurrentPosition == i)
                es.setVideoUrl(info.getPlayUrl().getUrl());
            episodes.add(es);
        }
        mCurrentPosition = info.getPosition();
        vpc_funshion.setContentView(fl_container).setVideoInfo(episodes, info.getVideoInfo().getName(), info.getPlayUrl().getUrl(), info.getPosition()).setVideoPlayerListener(this).build(getActivity(), FunshionPlayerFragment.this);
        //播放视频
//        playVideo(info.getVideoInfo().getVideoDetailList().get(info.getPosition()).getId());
        playMedia("99989", (info.getPosition() + 1) + "");
        vpc_funshion.setContentView(fl_container).setVideoInfo(episodes, info.getPosition(), mVideoInfo.getShowType(), "风行").setVideoPlayerListener(this).build(getActivity(), FunshionPlayerFragment.this);
        loadAD(new IADLoadListener() {
            @Override
            public void finishAd() {
                vpc_funshion.post(new Runnable() {
                    @Override
                    public void run() {
                        tv_skip.setVisibility(View.GONE);
                        adShowFinish(info);
                    }
                });
            }
        });
    }
    //监听
@@ -886,13 +1048,17 @@
    @Override
    public void selectEpisode(int p, VideoEpisode episode) {
        mShowAd = false;
        //选集
        final FunshionPlayInfo playInfo = new FunshionPlayInfo();
        playInfo = new FunshionPlayInfo();
        playInfo.setVideoInfo(mVideoInfo);
        playInfo.setPosition(p);
        playInfo.setCollected(collected);
        VideoDetailInfo detailInfo = mVideoInfo.getVideoDetailList().get(p);
        String uid = UserUtil.getUid(BeibeiVideoApplication.application);
        if (mVideoPlayer != null && mVideoPlayer.isPlaying())
            mVideoPlayer.pause();
        BeibeiVideoAPI.getPlayUrl(BeibeiVideoApplication.application, uid, detailInfo.getType(), mVideoInfo.getId(),
                detailInfo.getId(), videoResource.getId(), detailInfo.geteId(),
                new BasicTextHttpResponseHandler() {
@@ -913,14 +1079,17 @@
                                    }.getType());
                            PlayUrl info = new PlayUrl();
                            info.setResource(resource);
                            info.setPlayType(Integer.parseInt(jsonObject
                                    .getJSONObject("Data")
                            JSONObject data = jsonObject.getJSONObject("Data");
                            info.setPlayType(Integer.parseInt(data
                                    .optString("PlayType")));
                            info.setUrl(jsonObject.getJSONObject("Data")
                                    .optString("Url"));
                            info.setParams(jsonObject.getJSONObject("Data")
                            info.setUrl(
                                    data.optString("Url"));
                            info.setParams(data
                                    .optString("Params"));
                            info.setAid(data.optString("Aid"));
                            info.setVid(data.optString("Vid"));
                            playInfo.setPlayUrl(info);
                            mShowAd = false;
                            EventBus.getDefault().post(playInfo);
                        }
                    }
@@ -933,4 +1102,21 @@
    }
    //保存数据
    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(TAG, "onSaveInstanceState");
    }
    //恢复数据
    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
        Log.i(TAG, "onViewStateRestored");
    }
    interface IADLoadListener {
        public void finishAd();
    }
}