package com.letv.watchball.ui.impl; import android.app.Activity; import android.content.res.Configuration; import android.graphics.Rect; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.letv.ads.AdsManager; import com.letv.watchball.LetvApplication; import com.letv.watchball.R; import com.letv.watchball.ui.LetvBaseFragment; import com.letv.watchball.ui.PlayController; import com.letv.watchball.utils.UIs; import com.media.NativeInfos; import com.media.VideoView; import com.media.VideoView.VideoViewStateChangeListener; public class BasePlayFragment extends LetvBaseFragment implements android.media.MediaPlayer.OnErrorListener, android.media.MediaPlayer.OnPreparedListener, android.media.MediaPlayer.OnCompletionListener { private final int ON_VIDEO_START = 1;// 正片开始播放 private final int ON_VIDEO_PAUSE = 2;//正片暂停 private final int ON_VIDEO_RESUME = 3;//正片继续 private final int ON_VIDEO_COMPLATE = 4;//当视频播放完成 private final int ON_VIDEO_ERROR = 5;//当视频播放错误 private ViewGroup root ; private VideoView mVideoView; private Uri playUri; private PlayController mPlayController; /** * videoview状态变化的监听 * */ private VideoViewStateChangeListener stateChangeListener ; private boolean notResumeSeek = false; @Override public void onAttach(Activity activity) { super.onAttach(activity); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { root = (ViewGroup) UIs.inflate(inflater, R.layout.fragment_play, null, false); mVideoView = (VideoView) root.findViewById(R.id.video_view); return root; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(UIs.isLandscape(getActivity())){ ((BasePlayActivity)getActivity()).mPlayController.add_comment_main.setVisibility(View.GONE); UIs.zoomViewFull(root); } else { ((BasePlayActivity)getActivity()).mPlayController.add_comment_main.setVisibility(View.VISIBLE); UIs.zoomView(320, 180, root); } mPlayController = getPlayController(); AdsManager.getInstance().setVideoCallBack(mVideoCallBack); } private PlayController getPlayController() { return ((BasePlayActivity) getActivity()).mPlayController; } private AdsManager.VideoCallBack mVideoCallBack = new AdsManager.VideoCallBack() { @Override public void resumeVideo() { mVideoView.start(); } @Override public void pauseVideo() { mVideoView.pause(); } @Override public Rect getPlayerRect() { Rect rect = new Rect(); root.getGlobalVisibleRect(rect); // LogInfo.log("ads", "BasePlayFragment rect.top =" + rect.top + " rect.bottom= " + rect.bottom + " rect.left=" // + rect.left + " rect.right=" + rect.right); return rect; } }; @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if(UIs.isLandscape(getActivity())){ ((BasePlayActivity)getActivity()).mPlayController.add_comment_main.setVisibility(View.GONE); UIs.zoomViewFull(root); } else { ((BasePlayActivity)getActivity()).mPlayController.add_comment_main.setVisibility(View.VISIBLE); UIs.zoomView(320, 180, root); } } @Override public void onResume() { super.onResume(); if(mVideoView.getLastSeekWhenPrepared() != 0 && !notResumeSeek){ mVideoView.seekTo(mVideoView.getLastSeekWhenPrepared()); } mVideoView.start(); } @Override public void onPause() { super.onPause(); mVideoView.pause(); } @Override public void onDestroyView() { super.onDestroyView(); playUri = null ; mVideoView.stopPlayback(); root.removeAllViews(); root = null ; mVideoView = null ; } /** * 播放,兼容在线与本地播放器 * */ public void playLocal(String uriString , int msec) { NativeInfos.mIsLive = false; NativeInfos.mOffLinePlay = true; NativeInfos.doWithNativePlayUrl(uriString); playUri = Uri.parse(uriString); mVideoView.setVideoURI(playUri); mVideoView.setOnErrorListener(this); mVideoView.setOnCompletionListener(this); mVideoView.setOnPreparedListener(this); mVideoView.requestFocus(); if(msec > 0){ mVideoView.seekTo(msec); } mVideoView.start(); } /** * 播放在线 * */ public void playNet(String uriString, boolean isLive , boolean isDolby , int msec) { NativeInfos.mOffLinePlay = false; NativeInfos.mIsLive = isLive; initNativeInfos(); if(isDolby){ NativeInfos.mOffLinePlay = true ; NativeInfos.mIfNative3gpOrMp4 = true ; } playUri = Uri.parse(uriString); mVideoView.setVideoURI(playUri); mVideoView.setOnErrorListener(this); mVideoView.setOnCompletionListener(this); mVideoView.setOnPreparedListener(this); mVideoView.requestFocus(); if(msec > 0){ mVideoView.seekTo(msec); } mVideoView.start(); } /** * 播放 * */ public void start(){ mVideoView.start() ; } /** * 暂停 * */ public void pause(){ mVideoView.pause() ; } /** * 停止 * */ public void stopPlayback(){ mVideoView.stopPlayback() ; } /** * 跳到 * */ public void seekTo(int msec){ mVideoView.seekTo(msec); } /** * 快进 * */ public void forward(){ mVideoView.forward(); } /** * 快退 * */ public void rewind(){ mVideoView.rewind(); } /** * 是否在播放中 * */ public boolean isPlaying(){ return mVideoView.isPlaying() ; } /** * 是否暂停 * */ public boolean isPaused(){ return mVideoView.isPaused() ; } /** * 得到当前时间点 * */ public int getCurrentPosition(){ return mVideoView.getCurrentPosition() ; } /** * 得到当前缓冲时间点 * */ public int getBufferPercentage(){ return mVideoView.getBufferPercentage() ; } /** * 得到总时长 * */ public int getDuration(){ return mVideoView.getDuration() ; } /** * 是否进入播放状态(包括准备完成,播放,暂停,完成等) * */ public boolean isInPlaybackState(){ return mVideoView.isInPlaybackState() ; } public void setEnforcementWait(boolean enforcementWait){ if(mVideoView != null){ mVideoView.setEnforcementWait(enforcementWait); } } public void setEnforcementPause(boolean enforcementPause){ if(mVideoView != null){ mVideoView.setEnforcementPause(enforcementPause); } } public boolean isEnforcementPause(){ if(mVideoView != null){ return mVideoView.isEnforcementPause(); } return false ; } /** * 初始化播放器类型 本地播放器还是系统播放器 * */ public void initNativeInfos() { String vf = LetvApplication.getInstance().getVideoFormat(); if("ios".equals(vf)){ NativeInfos.mOffLinePlay = false; NativeInfos.mIsLive = false; } else if("no".equals(vf)){ NativeInfos.mOffLinePlay = true; NativeInfos.mIfNative3gpOrMp4 = true; NativeInfos.mIsLive = false; } } /** * 播放完成回调 * */ @Override public void onCompletion(MediaPlayer mp) { } /** * 准备完成回调 * */ @Override public void onPrepared(MediaPlayer mp) { } /** * 播放错误回调 * */ @Override public boolean onError(MediaPlayer mp, int what, int extra) { mPlayController.onError(what,extra); return false; } public VideoViewStateChangeListener getStateChangeListener() { return stateChangeListener; } /** * 播放器状态变换的监听 * */ public void setStateChangeListener(VideoViewStateChangeListener stateChangeListener) { this.stateChangeListener = stateChangeListener; mVideoView.setmStateChangeListener(this.stateChangeListener); } public boolean isNotResumeSeek() { return notResumeSeek; } public void setNotResumeSeek(boolean notResumeSeek) { this.notResumeSeek = notResumeSeek; } /** * 广告接口回调播放各种状态 * @param whichStatus * @param isHand */ private void callAdsPlayInterface(int whichStatus, boolean isHand) { try { if (mPlayController != null && mPlayController.mIVideoStatusInformer != null) { switch (whichStatus) { case ON_VIDEO_START: mPlayController.mIVideoStatusInformer.OnVideoStart();// 正片开始播放 public void OnVideoStart(); break; case ON_VIDEO_PAUSE: mPlayController.mIVideoStatusInformer.OnVideoPause(isHand);//正片暂停 是否由用户主动触发 break; case ON_VIDEO_RESUME: mPlayController.mIVideoStatusInformer.OnVideoResume(isHand);//正片继续 是否由用户主动触发 break; case ON_VIDEO_COMPLATE: mPlayController.mIVideoStatusInformer.OnVideoComplate();//当视频播放完成 public void OnVideoComplate(); break; case ON_VIDEO_ERROR: mPlayController.mIVideoStatusInformer.onVideoError();//当视频播放错误 public void onVideoError(); break; } } } catch (Exception e) { e.printStackTrace(); } } }