实例介绍
【实例简介】
【实例截图】
【核心代码】
package com.example.vediotest; import com.baidu.cyberplayer.core.BVideoView; import com.baidu.cyberplayer.core.BVideoView.OnCompletionListener; import com.baidu.cyberplayer.core.BVideoView.OnErrorListener; import com.baidu.cyberplayer.core.BVideoView.OnInfoListener; import com.baidu.cyberplayer.core.BVideoView.OnPreparedListener; import com.baidu.cyberplayer.core.BVideoView.OnPlayingBufferCacheListener; import android.app.Activity; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.PowerManager; import android.os.Process; import android.os.PowerManager.WakeLock; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.SeekBar.OnSeekBarChangeListener; public class VideoViewPlayingActivity extends Activity implements OnPreparedListener, OnCompletionListener, OnErrorListener, OnInfoListener, OnPlayingBufferCacheListener { private final String TAG = "VideoViewPlayingActivity"; /** * 鎮ㄧ殑AK 璇峰埌http://console.bce.baidu.com/iam/#/iam/accesslist鑾峰彇 */ private String AK = ""; // 璇峰綍鍏ユ偍鐨凙K !!! private String mVideoSource = null; private ImageButton mPlaybtn = null; private ImageButton mPrebtn = null; private ImageButton mForwardbtn = null; private LinearLayout mController = null; private SeekBar mProgress = null; private TextView mDuration = null; private TextView mCurrPostion = null; /** * 璁板綍鎾斁浣嶇疆 */ private int mLastPos = 0; /** * 鎾斁鐘舵? */ private enum PLAYER_STATUS { PLAYER_IDLE, PLAYER_PREPARING, PLAYER_PREPARED, } private PLAYER_STATUS mPlayerStatus = PLAYER_STATUS.PLAYER_IDLE; private BVideoView mVV = null; private EventHandler mEventHandler; private HandlerThread mHandlerThread; private final Object SYNC_Playing = new Object(); private WakeLock mWakeLock = null; private static final String POWER_LOCK = "VideoViewPlayingActivity"; private boolean mIsHwDecode = false; private final int EVENT_PLAY = 0; private final int UI_EVENT_UPDATE_CURRPOSITION = 1; class EventHandler extends Handler { public EventHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { switch (msg.what) { case EVENT_PLAY: /** * 濡傛灉宸茬粡鎾斁浜嗭紝绛夊緟涓婁竴娆℃挱鏀剧粨鏉? */ if (mPlayerStatus != PLAYER_STATUS.PLAYER_IDLE) { synchronized (SYNC_Playing) { try { SYNC_Playing.wait(); Log.v(TAG, "wait player status to idle"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 璁剧疆鎾斁url */ mVV.setVideoPath(mVideoSource); /** * 缁挱锛屽鏋滈渶瑕佸姝? */ if (mLastPos > 0) { mVV.seekTo(mLastPos); mLastPos = 0; } /** * 鏄剧ず鎴栬?闅愯棌缂撳啿鎻愮ず */ mVV.showCacheInfo(true); /** * 寮?鎾斁 */ mVV.start(); mPlayerStatus = PLAYER_STATUS.PLAYER_PREPARING; break; default: break; } } } Handler mUIHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { /** * 鏇存柊杩涘害鍙婃椂闂? */ case UI_EVENT_UPDATE_CURRPOSITION: int currPosition = mVV.getCurrentPosition(); int duration = mVV.getDuration(); updateTextViewWithTimeFormat(mCurrPostion, currPosition); updateTextViewWithTimeFormat(mDuration, duration); mProgress.setMax(duration); if (mVV.isPlaying()) { mProgress.setProgress(currPosition); } mUIHandler.sendEmptyMessageDelayed( UI_EVENT_UPDATE_CURRPOSITION, 200); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.controllerplaying); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, POWER_LOCK); mIsHwDecode = getIntent().getBooleanExtra("isHW", false); Uri uriPath = getIntent().getData(); if (null != uriPath) { String scheme = uriPath.getScheme(); if (null != scheme) { mVideoSource = uriPath.toString(); } else { mVideoSource = uriPath.getPath(); } } initUI(); /** * 寮?惎鍚庡彴浜嬩欢澶勭悊绾跨▼ */ mHandlerThread = new HandlerThread("event handler thread", Process.THREAD_PRIORITY_BACKGROUND); mHandlerThread.start(); mEventHandler = new EventHandler(mHandlerThread.getLooper()); } /** * 鍒濆鍖栫晫闈? */ private void initUI() { mPlaybtn = (ImageButton) findViewById(R.id.play_btn); mPrebtn = (ImageButton) findViewById(R.id.pre_btn); mForwardbtn = (ImageButton) findViewById(R.id.next_btn); mController = (LinearLayout) findViewById(R.id.controlbar); mProgress = (SeekBar) findViewById(R.id.media_progress); mDuration = (TextView) findViewById(R.id.time_total); mCurrPostion = (TextView) findViewById(R.id.time_current); registerCallbackForControl(); /** * 璁剧疆ak */ BVideoView.setAK(AK); /** * 鑾峰彇BVideoView瀵硅薄 */ mVV = (BVideoView) findViewById(R.id.video_view); /** * 娉ㄥ唽listener */ mVV.setOnPreparedListener(this); mVV.setOnCompletionListener(this); mVV.setOnErrorListener(this); mVV.setOnInfoListener(this); /** * 璁剧疆瑙g爜妯″紡 */ mVV.setDecodeMode(mIsHwDecode ? BVideoView.DECODE_HW : BVideoView.DECODE_SW); } /** * 涓烘帶浠舵敞鍐屽洖璋冨鐞嗗嚱鏁? */ private void registerCallbackForControl() { mPlaybtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub if (mVV.isPlaying()) { mPlaybtn.setImageResource(R.drawable.play_btn_style); /** * 鏆傚仠鎾斁 */ mVV.pause(); } else { mPlaybtn.setImageResource(R.drawable.pause_btn_style); /** * 缁х画鎾斁 */ mVV.resume(); } } }); /** * 瀹炵幇鍒囨崲绀轰緥 */ mPrebtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { /** * 濡傛灉宸茬粡鎾斁浜嗭紝绛夊緟涓婁竴娆℃挱鏀剧粨鏉? */ if (mPlayerStatus != PLAYER_STATUS.PLAYER_IDLE) { mVV.stopPlayback(); } /** * 鍙戣捣涓?鏂扮殑鎾斁浠诲姟 */ if (mEventHandler.hasMessages(EVENT_PLAY)) mEventHandler.removeMessages(EVENT_PLAY); mEventHandler.sendEmptyMessage(EVENT_PLAY); } }); mForwardbtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub } }); OnSeekBarChangeListener osbc1 = new OnSeekBarChangeListener() { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub // Log.v(TAG, "progress: " progress); updateTextViewWithTimeFormat(mCurrPostion, progress); } public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub /** * SeekBar寮?seek鏃跺仠姝㈡洿鏂? */ mUIHandler.removeMessages(UI_EVENT_UPDATE_CURRPOSITION); } public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub int iseekPos = seekBar.getProgress(); /** * SeekBark瀹屾垚seek鏃舵墽琛宻eekTo鎿嶄綔骞舵洿鏂扮晫闈? * */ mVV.seekTo(iseekPos); Log.v(TAG, "seek to " iseekPos); mUIHandler.sendEmptyMessage(UI_EVENT_UPDATE_CURRPOSITION); } }; mProgress.setOnSeekBarChangeListener(osbc1); } private void updateTextViewWithTimeFormat(TextView view, int second) { int hh = second / 3600; int mm = second % 3600 / 60; int ss = second % 60; String strTemp = null; if (0 != hh) { strTemp = String.format("%02d:%02d:%02d", hh, mm, ss); } else { strTemp = String.format("%02d:%02d", mm, ss); } view.setText(strTemp); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); /** * 鍦ㄥ仠姝㈡挱鏀惧墠 浣犲彲浠ュ厛璁板綍褰撳墠鎾斁鐨勪綅缃?浠ヤ究浠ュ悗鍙互缁挱 */ if (mPlayerStatus == PLAYER_STATUS.PLAYER_PREPARED) { mLastPos = mVV.getCurrentPosition(); mVV.stopPlayback(); } } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.v(TAG, "onResume"); if (null != mWakeLock && (!mWakeLock.isHeld())) { mWakeLock.acquire(); } /** * 鍙戣捣涓?鎾斁浠诲姟,褰撶劧鎮ㄤ笉涓?畾瑕佸湪杩欏彂璧? */ mEventHandler.sendEmptyMessage(EVENT_PLAY); } private long mTouchTime; private boolean barShow = true; @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub if (event.getAction() == MotionEvent.ACTION_DOWN) mTouchTime = System.currentTimeMillis(); else if (event.getAction() == MotionEvent.ACTION_UP) { long time = System.currentTimeMillis() - mTouchTime; if (time < 400) { updateControlBar(!barShow); } } return true; } public void updateControlBar(boolean show) { if (show) { mController.setVisibility(View.VISIBLE); } else { mController.setVisibility(View.INVISIBLE); } barShow = show; } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); /** * 閫?嚭鍚庡彴浜嬩欢澶勭悊绾跨▼ */ mHandlerThread.quit(); } @Override public boolean onInfo(int what, int extra) { // TODO Auto-generated method stub switch (what) { /** * 寮?缂撳啿 */ case BVideoView.MEDIA_INFO_BUFFERING_START: break; /** * 缁撴潫缂撳啿 */ case BVideoView.MEDIA_INFO_BUFFERING_END: break; default: break; } return true; } /** * 褰撳墠缂撳啿鐨勭櫨鍒嗘瘮锛?鍙互閰嶅悎onInfo涓殑寮?缂撳啿鍜岀粨鏉熺紦鍐叉潵鏄剧ず鐧惧垎姣斿埌鐣岄潰 */ @Override public void onPlayingBufferCache(int percent) { // TODO Auto-generated method stub } /** * 鎾斁鍑洪敊 */ @Override public boolean onError(int what, int extra) { // TODO Auto-generated method stub Log.v(TAG, "onError"); synchronized (SYNC_Playing) { SYNC_Playing.notify(); } mPlayerStatus = PLAYER_STATUS.PLAYER_IDLE; mUIHandler.removeMessages(UI_EVENT_UPDATE_CURRPOSITION); return true; } /** * 鎾斁瀹屾垚 */ @Override public void onCompletion() { // TODO Auto-generated method stub Log.v(TAG, "onCompletion"); synchronized (SYNC_Playing) { SYNC_Playing.notify(); } mPlayerStatus = PLAYER_STATUS.PLAYER_IDLE; mUIHandler.removeMessages(UI_EVENT_UPDATE_CURRPOSITION); } /** * 鍑嗗鎾斁灏辩华 */ @Override public void onPrepared() { // TODO Auto-generated method stub Log.v(TAG, "onPrepared"); mPlayerStatus = PLAYER_STATUS.PLAYER_PREPARED; mUIHandler.sendEmptyMessage(UI_EVENT_UPDATE_CURRPOSITION); } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论