BuWanVideo/AndroidManifest.xml
@@ -140,6 +140,7 @@ <activity android:name="com.weikou.beibeivideo.ui.mine.FXBrowserActivity" android:configChanges="screenSize|keyboardHidden|orientation" android:hardwareAccelerated="true" android:label="@string/app_name"> </activity> @@ -204,6 +205,7 @@ <activity android:name="com.weikou.beibeivideo.ui.video.VideoPlayerActivity" android:configChanges="orientation|screenSize|keyboardHidden" android:hardwareAccelerated="true" android:label="@string/app_name"></activity> BuWanVideo/res/layout/fragment_player_funshion.xml
@@ -14,8 +14,7 @@ <FrameLayout android:id="@+id/fl_container" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/aliuser_edittext_bg_color_normal"> android:layout_height="match_parent"> <com.lcjian.library.widget.RatioLayout android:id="@+id/rl_container" BuWanVideo/res/layout/sr_gdt_ad_view.xml
@@ -1,7 +1,7 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:id="@+id/ad_info_container" @@ -66,21 +66,20 @@ <FrameLayout android:id="@+id/custom_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="match_parent" android:layout_centerInParent="true"> <!-- 原生广告的视频组件 --> <com.qq.e.ads.nativ.MediaView android:id="@+id/gdt_media_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="match_parent" android:layout_gravity="center" android:background="#000" /> <!-- 原生广告的大图 --> <ImageView android:id="@+id/img_poster" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitXY" /> android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- 原生三小图 --> <LinearLayout @@ -140,5 +139,22 @@ android:layout_margin="5dp" android:textColor="@android:color/black" /> </LinearLayout> <TextView android:id="@+id/tv_skip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top|right" android:layout_margin="3dp" android:background="@drawable/shape_splash_ad" android:clickable="false" android:paddingLeft="8dp" android:paddingTop="2dp" android:paddingRight="8dp" android:paddingBottom="2dp" android:text="" android:textColor="@color/white" android:textSize="14sp" android:visibility="gone"></TextView> </FrameLayout> </LinearLayout> BuWanVideo/res/layout/video_detail_activity.xml
@@ -17,11 +17,11 @@ android:layout_weight="1" android:orientation="vertical"> <!-- android:background="@color/bg_download_so" --> <FrameLayout android:id="@+id/fragment_video_play_container1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/bg_download_so"> android:layout_height="wrap_content"> <FrameLayout android:id="@+id/fragment_video_play_container" @@ -56,7 +56,6 @@ android:layout_height="wrap_content"> </FrameLayout> <FrameLayout @@ -112,8 +111,6 @@ android:layout_height="50dp" android:layout_gravity="center" android:src="@drawable/ic_play"></ImageView> </FrameLayout> BuWanVideo/src/com/weikou/beibeivideo/entity/PlayUrl.java
@@ -5,48 +5,68 @@ import com.google.gson.annotations.Expose; public class PlayUrl implements Serializable { /** * */ private static final long serialVersionUID = 1L; @Expose private VideoResource resource; @Expose private String url; @Expose private int playType;// 0、不可播 1、站外-html 2、站内-播放器 @Expose private String params; /** * */ private static final long serialVersionUID = 1L; @Expose private VideoResource resource; @Expose private String url; @Expose private int playType;// 0、不可播 1、站外-html 2、站内-播放器 @Expose private String params; @Expose private String aid;//专辑ID @Expose private String vid;//视频ID public String getAid() { return aid; } public void setAid(String aid) { this.aid = aid; } public String getVid() { return vid; } public void setVid(String vid) { this.vid = vid; } public VideoResource getResource() { return resource; } return resource; } public void setResource(VideoResource resource) { this.resource = resource; } public void setResource(VideoResource resource) { this.resource = resource; } public String getUrl() { return url; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public void setUrl(String url) { this.url = url; } public int getPlayType() { return playType; } public int getPlayType() { return playType; } public void setPlayType(int playType) { this.playType = playType; } public void setPlayType(int playType) { this.playType = playType; } public String getParams() { return params; } public String getParams() { return params; } public void setParams(String params) { this.params = params; } public void setParams(String params) { this.params = params; } } BuWanVideo/src/com/weikou/beibeivideo/ui/ad/PlayVideoPreADFragment.java
@@ -422,7 +422,7 @@ public static VideoOption getVideoOption() { VideoOption.Builder builder = new VideoOption.Builder(); builder.setAutoPlayPolicy(VideoOption.AutoPlayPolicy.NEVER); builder.setAutoPlayMuted(true); builder.setAutoPlayMuted(false); builder.setDetailPageMuted(false); builder.setNeedCoverImage(true); builder.setNeedProgressBar(false); BuWanVideo/src/com/weikou/beibeivideo/ui/media/EpisodeFragment.java
@@ -402,6 +402,10 @@ .optString("Url")); info.setParams(jsonObject.getJSONObject("Data") .optString("Params")); info.setAid(jsonObject.getJSONObject("Data") .optString("Aid")); info.setVid(jsonObject.getJSONObject("Data") .optString("Vid")); Play play = new Play(); play.setPlayUrl(info); EventBus.getDefault().post(play); @@ -476,7 +480,22 @@ }); } else { fl_native_ad1.setVisibility(View.GONE); //加载穿山甲 new ExpressAdManager(AdUtil.AD_TYPE.csj, getContext()).loadVideoDetailPlayerBottomAd(new ExpressAdManager.IAdLoadListener() { @Override public void onSuccess(List<ExpressAdContainer> adList) { if (adList != null && adList.size() > 0) { ExpressAdManager.renderAndFillAd(getActivity(), adList.get(0), fl_native_ad1, new ExpressAdManager.IAdEventListener() { @Override public void closeAd(ExpressAdContainer ad) { fl_native_ad1.removeAllViews(); } }); } else { fl_native_ad1.setVisibility(View.GONE); } } }); } } }); BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailActivity.java
@@ -842,6 +842,10 @@ .optString("Url")); info.setParams(jsonObject.getJSONObject("Data") .optString("Params")); info.setAid(jsonObject.getJSONObject("Data") .optString("Aid")); info.setVid(jsonObject.getJSONObject("Data") .optString("Vid")); playUrl = info; if (videoInfo == null) { return; BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailActivity2.java
@@ -62,6 +62,7 @@ import com.weikou.beibeivideo.ui.BaseActivity; import com.weikou.beibeivideo.ui.ad.PlayVideoPreADFragment; import com.weikou.beibeivideo.ui.common.ShareActivity; import com.weikou.beibeivideo.ui.mine.FXBrowserActivity; import com.weikou.beibeivideo.ui.video.FunshionPlayerFragment; import com.weikou.beibeivideo.ui.video.VideoPlayerActivity; import com.weikou.beibeivideo.util.BeibeiConstant; @@ -132,6 +133,8 @@ fl_video_play_background = findViewById(R.id.fl_video_play_background); iv_background = findViewById(R.id.iv_video_play_background); fl_ad = findViewById(R.id.fl_ad); initPlayer(); } @Override @@ -266,9 +269,6 @@ .commitAllowingStateLoss(); } iNet(); if (fl_ad != null) fl_ad.setVisibility(View.VISIBLE); } @@ -371,6 +371,7 @@ VideoPlayerActivity.class); intent.putExtra("url", playUrl.getUrl()); startActivity(intent); initPlayer(); } else if (playUrl.getPlayType() == 2) { iv_select_play.setVisibility(View.GONE); iv_background.setClickable(false); @@ -387,9 +388,11 @@ // EventBus.getDefault().post(playUrl); Toast.makeText(VideoDetailActivity2.this, "影片加载中...", Toast.LENGTH_LONG).show(); initPlayer(); } saveWatchHistory("爱奇艺"); } } else if (playUrl.getResource().getName().contains("风行")) { if (playUrl.getPlayType() == 0) { @@ -397,25 +400,27 @@ Toast.LENGTH_LONG).show(); return; } else if (playUrl.getPlayType() == 1) { // Intent intent = new Intent(VideoDetailActivity2.this, // FXBrowserActivity.class); // intent.putExtra("url", playUrl.getUrl()); // startActivity(intent); Intent intent = new Intent(VideoDetailActivity2.this, FXBrowserActivity.class); intent.putExtra("url", playUrl.getUrl()); startActivity(intent); saveWatchHistory("风行"); } fl_video_play_background.setVisibility(View.GONE); //播放风行视频 //添加风行播放页 mFunshionPlayerFragment = new FunshionPlayerFragment(); Bundle bundle = new Bundle(); bundle.putSerializable("videoInfo", videoInfo); bundle.putSerializable("playUrl", playUrl); bundle.putInt("position", mPosition); bundle.putBoolean("collect", false); bundle.putSerializable("resource", resource); mFunshionPlayerFragment.setArguments(bundle); if (!mFunshionPlayerFragment.isAdded()) { getSupportFragmentManager().beginTransaction().replace(R.id.fragment_video_play_container, mFunshionPlayerFragment).commit(); initPlayer(); } else if (playUrl.getPlayType() == 2) {//SDK播放 //播放风行视频 //添加风行播放页 mFunshionPlayerFragment = new FunshionPlayerFragment(); Bundle bundle = new Bundle(); bundle.putSerializable("videoInfo", videoInfo); bundle.putSerializable("playUrl", playUrl); bundle.putInt("position", mPosition); bundle.putBoolean("collect", false); bundle.putSerializable("resource", resource); mFunshionPlayerFragment.setArguments(bundle); if (!mFunshionPlayerFragment.isAdded()) { getSupportFragmentManager().beginTransaction().replace(R.id.fragment_video_play_container, mFunshionPlayerFragment).commit(); } fl_video_play_background.setVisibility(View.GONE); } } else { @@ -430,6 +435,7 @@ startActivity(intent); saveWatchHistory(playUrl.getResource().getName()); } initPlayer(); } } @@ -439,6 +445,16 @@ public void onEventMainThread(Playlocation location) { fl_ad.setVisibility(View.VISIBLE); mPosition = location.getPosition(); } /** * 初始化播放器 */ private void initPlayer() { fl_ad.setVisibility(View.GONE); iv_select_play.setVisibility(View.VISIBLE); iv_background.setVisibility(View.VISIBLE); fl_video_play_background.setVisibility(View.VISIBLE); } @@ -574,9 +590,9 @@ // Hide the status bar隐藏状态栏 //测试 不做全屏 // WindowManager.LayoutParams attrs = getWindow().getAttributes(); // attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; // getWindow().setAttributes(attrs); WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; getWindow().setAttributes(attrs); Fragment videoDetailFragment = getSupportFragmentManager() .findFragmentByTag("VideoDetailFragment"); @@ -891,19 +907,23 @@ }.getType()); PlayUrl info = new PlayUrl(); info.setResource(resource); info.setPlayType(Integer.parseInt(jsonObject .getJSONObject("Data") .optString("PlayType"))); info.setUrl(jsonObject.getJSONObject("Data") JSONObject data = jsonObject .getJSONObject("Data"); info.setPlayType(Integer.parseInt( data.optString("PlayType"))); info.setUrl(data .optString("Url")); info.setParams(jsonObject.getJSONObject("Data") info.setParams(data .optString("Params")); info.setAid(data.optString("Aid")); info.setVid(data.optString("Vid")); playUrl = info; if (videoInfo == null) { return; } fl_ad.setVisibility(View.VISIBLE); if (!isSetup || isClick) { fl_ad.setVisibility(View.VISIBLE); startPlay(); isClick = false; } BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoEpisodeFragment.java
@@ -470,7 +470,7 @@ new ExpressAdManager(AdUtil.AD_TYPE.gdt2, getContext()).loadVideoDetailRelativeVideoBottomAd(new ExpressAdManager.IAdLoadListener() { @Override public void onSuccess(List<ExpressAdContainer> adList) { if (adList != null && adList.size() > 0) if (adList != null && adList.size() > 0) { ExpressAdManager.renderAd(getActivity(), adList.get(0), new ExpressAdManager.IAdRenderListener() { @Override public void onRenderSuccess(List<ExpressAdContainer> adList) { @@ -488,6 +488,21 @@ fl_native_ad_1.removeAllViews(); } }); } else { new ExpressAdManager(AdUtil.AD_TYPE.csj, getContext()).loadVideoDetailRelativeVideoBottomAd(new ExpressAdManager.IAdLoadListener() { @Override public void onSuccess(List<ExpressAdContainer> adList) { if (adList != null && adList.size() > 0) { ExpressAdManager.renderAndFillAd(getActivity(), adList.get(0), fl_native_ad_1, new ExpressAdManager.IAdEventListener() { @Override public void closeAd(ExpressAdContainer ad) { fl_native_ad_1.removeAllViews(); } }); } } }); } } }); BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoEpisodeFragment2.java
@@ -158,6 +158,10 @@ .optString("Url")); info.setParams(jsonObject.getJSONObject("Data") .optString("Params")); info.setAid(jsonObject.getJSONObject("Data") .optString("Aid")); info.setVid(jsonObject.getJSONObject("Data") .optString("Vid")); Play play = new Play(); play.setPlayUrl(info); EventBus.getDefault().post(play); BuWanVideo/src/com/weikou/beibeivideo/ui/mine/FXBrowserActivity.java
@@ -51,6 +51,8 @@ private FrameLayout fl_webview, fl_full_play; ProgressBar progressBar; private final String TAG="FXBrowserActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -123,7 +125,8 @@ return true; } else if (url.contains("/tbopen/") || url.startsWith("tbopen://")) { return true; } }else if(!url.startsWith("http")) return true; return super.shouldOverrideUrlLoading(view, url); } @@ -144,6 +147,18 @@ super.onReceivedTitle(view, title); tv_title.setText(title); } @Override public void onShowCustomView(View view, CustomViewCallback callback) { super.onShowCustomView(view, callback); Log.i(TAG,"onShowCustomView"); } @Override public void onHideCustomView() { super.onHideCustomView(); Log.i(TAG,"onHideCustomView"); } }); progressBar = findViewById(R.id.myProgressBar); progressBar.setMax(100); BuWanVideo/src/com/weikou/beibeivideo/ui/recommend/RecommendNewAdapter.java
@@ -34,7 +34,7 @@ import com.weikou.beibeivideo.entity.video.holder.VideoHolder; import com.weikou.beibeivideo.ui.common.VideosLiveActivity; import com.weikou.beibeivideo.ui.discover.StarsActivity; import com.weikou.beibeivideo.ui.media.VideoDetailActivity; import com.weikou.beibeivideo.ui.media.VideoDetailActivity2; import com.weikou.beibeivideo.ui.video.VideoColumn2Adapter; import com.weikou.beibeivideo.util.VideoUtil; import com.weikou.beibeivideo.util.ad.AdUtil; @@ -522,7 +522,7 @@ private void myClick(VideoInfo info, final View v) { Intent intent = new Intent(v.getContext(), VideoDetailActivity.class); Intent intent = new Intent(v.getContext(), VideoDetailActivity2.class); intent.putExtra("video_info", info); v.getContext().startActivity(intent); } 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(); } } BuWanVideo/src/com/weikou/beibeivideo/util/ad/CSJConstant.java
@@ -17,6 +17,13 @@ //视频前贴 public static String PLAY_VIDEO_PRE = "887389927"; //视频详情页视频播放器底部 public static String VIDEO_DETAIL_PLAYER_BOTTOM = "945548900"; //视频详情页猜你喜欢底部 public static String VIDEO_DETAIL_GUESSLIKE_TOP = "945548915"; //无效广告 public static String INVALID_AD = "111111111"; BuWanVideo/src/com/weikou/beibeivideo/util/ad/ExpressAdManager.java
@@ -12,6 +12,7 @@ import com.bytedance.sdk.openadsdk.TTAdManager; import com.bytedance.sdk.openadsdk.TTAdNative; import com.bytedance.sdk.openadsdk.TTNativeExpressAd; import com.google.gson.Gson; import com.qq.e.ads.cfg.VideoOption; import com.qq.e.ads.nativ.ADSize; import com.qq.e.ads.nativ.NativeExpressAD; @@ -170,10 +171,11 @@ * @param adLoadListener */ public void loadVideoDetailPlayerBottomAd(final IAdLoadListener adLoadListener) { Log.i(TAG, "loadVideoDetailPlayerBottomAd"); //加载大图 String pid = null; if (sourceType == AdUtil.AD_TYPE.csj) { pid = "945375047"; pid = CSJConstant.VIDEO_DETAIL_PLAYER_BOTTOM; } else if (sourceType == AdUtil.AD_TYPE.gdt2) { pid = GDTConstant.PID_2_VIDEO_DETAIL_PLAY_EXPRESS1; } @@ -181,7 +183,7 @@ int deviceWidth = DimenUtils.getScreenWidth(mContext); deviceWidth = DimenUtils.px2dip(mContext, deviceWidth); int width = (deviceWidth - 20); int height = 80; int height = 100; loadAd(width, height, pid, 1, adLoadListener); } @@ -195,7 +197,7 @@ //加载大图 String pid = null; if (sourceType == AdUtil.AD_TYPE.csj) { pid = "945375047"; pid = CSJConstant.VIDEO_DETAIL_GUESSLIKE_TOP; } else if (sourceType == AdUtil.AD_TYPE.gdt2) { pid = GDTConstant.PID_2_VIDEO_DETAIL_PLAY_EXPRESS2; } @@ -397,6 +399,9 @@ * @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<NativeExpressADData2> list) { library-mine/res/layout/video_player_controller.xml
@@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> android:layout_height="match_parent" android:keepScreenOn="true"> <!--顶部控件 --> <LinearLayout @@ -150,11 +151,12 @@ android:visibility="gone"></ImageView> <FrameLayout android:visibility="gone" android:id="@+id/fl_loading" android:layout_width="95dp" android:layout_height="95dp" android:layout_gravity="center"> android:layout_gravity="center" android:visibility="gone"> <include layout="@layout/item_player_loading"></include> </FrameLayout> @@ -284,7 +286,6 @@ android:background="@drawable/shape_player_definition_bg" android:drawablePadding="6dp" android:padding="8dp" android:text="来源:爱奇艺" android:textColor="#ffeeeeee" android:textSize="9sp" android:visibility="gone" /> library-mine/src/com/lcjian/library/video/VideoEpisode.java
@@ -5,6 +5,15 @@ private String name;//名称 private String tag; private String videoId; private String videoUrl;//视频链接 public String getVideoUrl() { return videoUrl; } public void setVideoUrl(String videoUrl) { this.videoUrl = videoUrl; } public String getName() { return name; library-mine/src/com/lcjian/library/video/VideoEpisodeDialog.java
@@ -56,7 +56,7 @@ /** * @param videoEpisodes * @param position * @param showType 1-小方格 2-长条 * @param showType 1-长条 2-小方格 * @return */ public Builder setEpisodes(List<VideoEpisode> videoEpisodes, int position, int showType) { @@ -81,7 +81,7 @@ } }); if (showType == 1) { if (showType == 2) { gv_episode.setNumColumns(4); } else { gv_episode.setNumColumns(1); @@ -95,8 +95,17 @@ WindowManager.LayoutParams params = videoLoadingDialog.getWindow() .getAttributes(); params.width = DimenUtils.dip2px(activity, 220); params.height = DimenUtils.getScreenHeight(activity); params.height = WindowManager.LayoutParams.MATCH_PARENT; //WindowManager.LayoutParams.MATCH_PARENT; //DimenUtils.getScreenWidth(activity); videoLoadingDialog.getWindow().setAttributes(params); //防止被状态栏占用高度 int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_FULLSCREEN; videoLoadingDialog.getWindow().getDecorView().setSystemUiVisibility(uiOptions); videoLoadingDialog.getWindow().setGravity(Gravity.RIGHT);//设置显示在右侧 videoLoadingDialog.setCanceledOnTouchOutside(true); @@ -128,7 +137,7 @@ textView.setMaxLines(1); textView.setTextColor(Color.WHITE); textView.setEllipsize(TextUtils.TruncateAt.END); if (showType == 1) { if (showType == 2) { ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(DimenUtils.dip2px(activity, 35), DimenUtils.dip2px(activity, 35)); textView.setLayoutParams(params); } else { @@ -149,7 +158,7 @@ @Override public void onClick(View v) { if (canClick) { Builder.this.position=position; Builder.this.position = position; notifyDataSetChanged(); if (dialogClick != null) dialogClick.selectEpisode(position, videoEpisode); library-mine/src/com/lcjian/library/video/VideoPlayerController.java
@@ -58,6 +58,7 @@ private String videoName; private String videoUrl; private boolean collected;//是否收藏 private String mResourceName; private Timer timer; @@ -98,6 +99,8 @@ //正在播放的位置 private int mPlayingPosition; private int mShowType;//1-长条 2-小方格 private AQuery aq; @@ -187,15 +190,17 @@ * * @param episodeList * @param videoName * @param videoUrl * @param playingPosition * @return */ public VideoPlayerController setVideoInfo(List<VideoEpisode> episodeList, String videoName, String videoUrl, int playingPosition) { this.videoName = videoName; this.videoUrl = videoUrl; public VideoPlayerController setVideoInfo(List<VideoEpisode> episodeList, int playingPosition, int showType, String resourceName) { VideoEpisode currentVideoEpisode = episodeList.get(playingPosition); this.videoName = currentVideoEpisode.getName(); this.videoUrl = currentVideoEpisode.getVideoUrl(); this.episodeList = episodeList; this.mPlayingPosition = playingPosition; this.mShowType = showType; this.mResourceName = resourceName; return this; } @@ -262,6 +267,7 @@ VideoPlayerController.this.continuePlay(); //不需要提醒 needNotifyMobileData = false; setPlayImage(); } @Override @@ -271,6 +277,8 @@ }).build(mActivity); if (!networkNotiftDialog.isShowing()) networkNotiftDialog.show(); } else { continuePlay(); } break; case ConnectivityManager.TYPE_WIFI: @@ -286,7 +294,30 @@ pausePlay(); } //设置播放按钮的状态按钮的 setPlayImage(); } private void setPlayImage() { if (iv_play != null) iv_play.postDelayed(new Runnable() { @Override public void run() { if (mediaPlayer == null) { return; } VideoResourceUtil.setPlayImage(iv_play, mediaPlayer.isPlaying(), isLand); if (mediaPlayer.isPlaying()) { aq.id(R.id.iv_play_center).visibility(View.GONE); } else { if (!isLand) { aq.id(R.id.iv_play_center).visibility(View.VISIBLE); } } } }, 100); } /** * 设置电量变化 @@ -362,7 +393,10 @@ public void onProgressChanged(SeekBar seekBar, int precent, boolean b) { if (isTouch) { //计算 拖拉后的 时间长度: int positionLong = mediaPlayer.getDuration() * seekBar.getProgress() / 1000; int process = mediaPlayer.getDuration(); float f = seekBar.getProgress() / 1000.0f; int positionLong = (int) (process * f); Log.i(TAG, "position:" + positionLong); mediaPlayer.seekTo(positionLong); } @@ -395,6 +429,7 @@ setLayout(); tv_title.setText(videoName); tv_link.setText(videoUrl); tv_resource.setText("来源:" + mResourceName); setCollect(this.collected); showLoading(); @@ -437,7 +472,7 @@ @Override public void onClick(View v) { //当前集 episodeDialog = new VideoEpisodeDialog.Builder().setEpisodes(episodeList, mPlayingPosition, 1).setDialogClick(new VideoEpisodeDialog.IDialogClick() { episodeDialog = new VideoEpisodeDialog.Builder().setEpisodes(episodeList, mPlayingPosition, mShowType).setDialogClick(new VideoEpisodeDialog.IDialogClick() { @Override public void selectEpisode(int p, VideoEpisode ve) { if (videoPlayerListener != null) @@ -464,11 +499,10 @@ if (mediaPlayer != null) { if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); VideoResourceUtil.setPlayImage(iv_play, true, isLand); } else { mediaPlayer.start(); VideoResourceUtil.setPlayImage(iv_play, false, isLand); } setPlayerState(); } } }); @@ -621,6 +655,7 @@ } private void setLayout() { Log.i(TAG, "setLayout"); if (isLand) { findViewById(R.id.fl_state).setVisibility(View.VISIBLE); // if (iv_collection.getVisibility() == View.GONE) @@ -684,8 +719,13 @@ if (mediaPlayer != null && mediaPlayer.isPlaying()) { int currentPosition = getSeconds(mediaPlayer.getCurrentPosition()); tv_progress.setText(TimeUtil.getTimeDesc(currentPosition)); seekBar.setProgress(Math.round(mediaPlayer.getCurrentPosition() * 1000 / mediaPlayer.getDuration())); setPlayerState(); seekBar.setProgress(Math.round(mediaPlayer.getCurrentPosition() * 1000.0f / mediaPlayer.getDuration())); Log.i(TAG, Math.abs(mediaPlayer.getDuration() - mediaPlayer.getCurrentPosition()) + ""); if (Math.abs(mediaPlayer.getDuration() - mediaPlayer.getCurrentPosition()) < 1000) {//播放完成 tv_progress.removeCallbacks(playerProcessRunnable); iv_next.performClick(); return; } } tv_progress.postDelayed(playerProcessRunnable, 1000); } @@ -729,15 +769,7 @@ private void setPlayerState() { if (mediaPlayer != null) { if (mediaPlayer.isPlaying()) { VideoResourceUtil.setPlayImage(iv_play, false, isLand); aq.id(R.id.iv_play_center).visibility(View.GONE); } else { VideoResourceUtil.setPlayImage(iv_play, true, isLand); if (!isLand) { aq.id(R.id.iv_play_center).visibility(View.VISIBLE); } } setPlayImage(); } } @@ -817,6 +849,14 @@ aq.id(R.id.fl_loading).visibility(View.GONE); } public void onResume() { setLayout(); } public void onPause() { setLayout(); } /** * 释放资源 */ library-mine/src/com/lcjian/library/video/VideoResourceUtil.java
@@ -16,26 +16,36 @@ */ public static void setPlayImage(ImageView iv_play, boolean isPlaying, boolean land) { String resourceName = ""; if (isPlaying) if (land) resourceName = "ic_player_play"; else resourceName = "ic_player_play_small"; else { if (isPlaying) { if (land) resourceName = "ic_player_pause"; else resourceName = "ic_player_pause_small"; } else { if (land) resourceName = "ic_player_play"; else resourceName = "ic_player_play_small"; } Object picture = iv_play.getTag(); if (picture != null && picture.toString().equalsIgnoreCase(resourceName)) { return; } iv_play.setTag(resourceName); iv_play.setImageResource(iv_play.getResources().getIdentifier(resourceName, "drawable", iv_play.getContext().getPackageName())); ViewGroup.LayoutParams params = iv_play.getLayoutParams(); if (land) { params.width = DimenUtils.dip2px(iv_play.getContext(), 38); params.height = DimenUtils.dip2px(iv_play.getContext(), 38); iv_play.setPadding(0, 0, 0, 0); } else { int padding = DimenUtils.dip2px(iv_play.getContext(), 5); iv_play.setPadding(padding, padding, padding, padding); params.width = ViewGroup.LayoutParams.WRAP_CONTENT; params.height = DimenUtils.dip2px(iv_play.getContext(), 14); params.height = DimenUtils.dip2px(iv_play.getContext(), 24); } }