android MediaPlayer SurfaceView 网络视频播放器

Demo下载:http://download.csdn.net/detail/menglele1314/9383426


package com.video;import android.app.Activity;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.media.MediaPlayer;import android.media.MediaPlayer.OnPreparedListener;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.KeyEvent;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.view.WindowManager;import android.widget.Button;import android.widget.LinearLayout;import android.widget.ProgressBar;import android.widget.SeekBar;import android.widget.TextView;import android.widget.Toast;public class VideoPlayerActivity extends Activity implements OnClickListener {// 视频播放地址private String videoUrl = "http://v.iask.com/v_play_ipad.php?vid=138152839";/*************************************************/private SurfaceView video_sv;// 绘图容器对象,用于把视频显示在屏幕上private ProgressBar video_pb;private LinearLayout video_ll_title;private Button video_btn_back;private TextView video_tv_name;// 视频名称显示的viewprivate LinearLayout video_ll_bottom;private Button video_btn_play;// 用于开始和暂停的按钮private TextView video_tv_otime;private SeekBar video_seekbar_time;// 进度条控件private TextView video_tv_ctime;private Button video_btn_full;private Button video_btn_lock;private MediaPlayer mediaPlayer; // 播放器控件private upDateSeekBar playingSeekBar; // 更新进度条用private int postSize; // 保存义播视频大小private boolean flag = true; // 用于判断视频是否在播放中private static long lastClickTime;private int position = 0;private boolean isLocked = false;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);/* 去掉title */requestWindowFeature(Window.FEATURE_NO_TITLE);/* 设置屏幕常亮 *//* flag:标记 ; */getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);setContentView(R.layout.activity_video); // 加载布局文件initView(); // 初始化数据playVideo();setListener(); // 绑定相关事件}@SuppressWarnings("deprecation")private void playVideo() {video_pb.setVisibility(View.VISIBLE);video_tv_name.setText("视屏名称xxx");// 视频标题video_btn_play.setEnabled(false); // 刚进来,设置其不可点击video_sv.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);video_sv.getHolder().setKeepScreenOn(true); // 保持屏幕高亮video_sv.getHolder().addCallback(new surFaceView()); // 设置监听事件mHandler.sendMessageDelayed(mHandler.obtainMessage(0x124), 3000);// 隐藏控件}private void initView() {video_sv = (SurfaceView) findViewById(R.id.video_sv);video_pb = (ProgressBar) findViewById(R.id.video_pb);video_ll_title = (LinearLayout) findViewById(R.id.video_ll_title);video_btn_back = (Button) findViewById(R.id.video_btn_back);video_btn_back.setOnClickListener(this);video_tv_name = (TextView) findViewById(R.id.video_tv_name);video_ll_bottom = (LinearLayout) findViewById(R.id.video_ll_bottom);video_btn_play = (Button) findViewById(R.id.video_btn_play);video_btn_play.setOnClickListener(this);video_tv_otime = (TextView) findViewById(R.id.video_tv_otime);video_seekbar_time = (SeekBar) findViewById(R.id.video_seekbar_time);video_tv_ctime = (TextView) findViewById(R.id.video_tv_ctime);video_btn_full = (Button) findViewById(R.id.video_btn_full);video_btn_full.setOnClickListener(this);video_btn_lock = (Button) findViewById(R.id.video_btn_lock);video_btn_lock.setOnClickListener(this);mediaPlayer = new MediaPlayer(); // 创建一个播放器对象playingSeekBar = new upDateSeekBar(); // 创建更新进度条对象}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.video_btn_back:// 返回finish();break;case R.id.video_btn_lock:if (isLocked) {unLockScreen();// 解锁isLocked = false;} else {lockScreen();// 锁定isLocked = true;}break;default:break;}}private void lockScreen() {video_btn_lock.setBackgroundResource(R.drawable.player_landscape_screen_off_normal);video_ll_title.setVisibility(View.GONE);video_ll_bottom.setVisibility(View.GONE);}private void unLockScreen() {video_btn_lock.setBackgroundResource(R.drawable.player_landscape_screen_on_noraml);video_ll_title.setVisibility(View.VISIBLE);video_ll_bottom.setVisibility(View.VISIBLE);}/** * 更新进度条 */Handler mHandler = new Handler() {public void handleMessage(Message msg) {if (msg.what == 0x124) {video_ll_title.setVisibility(View.GONE);video_ll_bottom.setVisibility(View.GONE);} else {if (mediaPlayer == null) {flag = false;} else if (mediaPlayer.isPlaying()) {flag = true;int position = mediaPlayer.getCurrentPosition();int mMax = mediaPlayer.getDuration();int sMax = video_seekbar_time.getMax();if (mMax > 0) {video_tv_otime.setText(change(position / 1000));video_tv_ctime.setText(change(mMax / 1000));video_seekbar_time.setProgress(position * sMax / mMax);} else {Toast.makeText(VideoPlayerActivity.this, "无法播放",Toast.LENGTH_LONG).show();}}}};};class upDateSeekBar implements Runnable {@Overridepublic void run() {mHandler.sendMessage(Message.obtain());if (flag) {mHandler.postDelayed(playingSeekBar, 1000);}}}class PlayMovie extends Thread { // 播放视频的线程int post = 0;public PlayMovie(int post) {this.post = post;}@Overridepublic void run() {super.run();try {mediaPlayer.reset(); // 回复播放器默认mediaPlayer.setDataSource(videoUrl); // 设置播放路径mediaPlayer.setDisplay(video_sv.getHolder()); // 把视频显示在SurfaceView上mediaPlayer.setOnPreparedListener(new PreparedListener(post)); // 设置监听事件mediaPlayer.prepare(); // 准备播放mediaPlayer.seekTo(50000);} catch (Exception e) {e.printStackTrace();}}}class PreparedListener implements OnPreparedListener {int postSize;public PreparedListener(int postSize) {this.postSize = postSize;}@Overridepublic void onPrepared(MediaPlayer mp) {Log.e("onPrepared", "----onPrepared");video_pb.setVisibility(View.GONE); // 准备完成后,隐藏控件video_btn_play.setBackgroundResource(R.drawable.qiyi_sdk_play_btn_pause);if (mediaPlayer != null) {mediaPlayer.start(); // 开始播放视频} else {return;}if (postSize > 0) { // 说明中途停止过(activity调用过pase方法,不是用户点击停止按钮),跳到停止时候位置开始播放mediaPlayer.seekTo(postSize); // 跳到postSize大小位置处进行播放}new Thread(playingSeekBar).start(); // 启动线程,更新进度条}}private class surFaceView implements Callback { // 上面绑定的监听的事件@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {mediaPlayer.setDisplay(holder);}@Overridepublic void surfaceCreated(SurfaceHolder holder) { // 创建完成后调用if (postSize > 0 && videoUrl != null) { // 说明,停止过activity调用过pase方法,跳到停止位置播放new PlayMovie(postSize).start();flag = true;int sMax = video_seekbar_time.getMax();int mMax = mediaPlayer.getDuration();video_tv_otime.setText(change(mediaPlayer.getCurrentPosition() / 1000));video_tv_ctime.setText(change(mediaPlayer.getDuration() / 1000));video_seekbar_time.setProgress(postSize * sMax / mMax);postSize = 0;video_pb.setVisibility(View.GONE);} else {new PlayMovie(0).start();// 表明是第一次开始播放}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) { // activity调用过pase方法,保存当前播放位置if (mediaPlayer != null && mediaPlayer.isPlaying()) {postSize = mediaPlayer.getCurrentPosition();mediaPlayer.stop();flag = false;video_pb.setVisibility(View.VISIBLE);}}}@Overrideprotected void onResume() {super.onResume();video_btn_play.setEnabled(true);video_btn_play.setBackgroundResource(R.drawable.qiyi_sdk_play_btn_pause);}@Overrideprotected void onPause() {super.onPause();if (mediaPlayer != null) {if (mediaPlayer.isPlaying()) {position = mediaPlayer.getCurrentPosition();mediaPlayer.stop();SharedPreferences share = getSharedPreferences("video_player",0);Editor editor = share.edit();editor.putInt("position", position);editor.commit();}}}@Overrideprotected void onDestroy() { // activity销毁后,释放资源super.onDestroy();if (mediaPlayer != null) {if (mediaPlayer.isPlaying()) {mediaPlayer.stop();}mediaPlayer.release();mediaPlayer = null;}System.gc();}private void setListener() {if (mediaPlayer == null) {return;}mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {@Overridepublic void onBufferingUpdate(MediaPlayer mp, int percent) {video_seekbar_time.setSecondaryProgress(percent);}});mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { // 视频播放完成@Overridepublic void onCompletion(MediaPlayer mp) {flag = false;video_tv_otime.setText(change(mediaPlayer.getDuration() / 1000));video_btn_play.setBackgroundResource(R.drawable.qiyi_sdk_play_btn_player);// 播放完成后需要自动播放下一集Log.e("mediaPlayer", "本集结束");}});mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {}});mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer arg0, int arg1, int arg2) {Log.e("mediaPlayer", "无法播放:" + arg1 + ":" + arg2);return false;}});/** * 如果视频在播放,则调用mediaPlayer.pause();,停止播放视频,反之,mediaPlayer.start() * ,同时换按钮背景 */video_btn_play.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (mediaPlayer.isPlaying()) {video_btn_play.setBackgroundResource(R.drawable.qiyi_sdk_play_btn_player);mediaPlayer.pause();postSize = mediaPlayer.getCurrentPosition();} else {video_btn_play.setBackgroundResource(R.drawable.qiyi_sdk_play_btn_pause);mediaPlayer.start();if (flag == false) {flag = true;new Thread(playingSeekBar).start();}}}});video_seekbar_time.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {if (isFastDoubleClick()) {int value = video_seekbar_time.getProgress()* mediaPlayer.getDuration() // 计算进度条需要前进的位置数据大小/ video_seekbar_time.getMax();video_tv_otime.setText(change(value / 1000));mediaPlayer.seekTo(value);}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar,int progress, boolean fromUser) {}});/** * 点击屏幕,切换控件的显示,显示则应藏,隐藏,则显示 */video_sv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 只有全屏时才显示操作按钮// if (!isFullScreen) {// return;// }if (isLocked) {video_ll_title.setVisibility(View.GONE);video_ll_bottom.setVisibility(View.GONE);} else {video_ll_title.setVisibility(View.VISIBLE);video_ll_bottom.setVisibility(View.VISIBLE);mHandler.sendMessageDelayed(mHandler.obtainMessage(0x124),3000);// 隐藏控件}}});}// 防止用户频繁操作public static boolean isFastDoubleClick() {long time = System.currentTimeMillis();long timeD = time - lastClickTime;if (3000 < timeD) {return true;}lastClickTime = time;return false;}@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {// 如果是锁定状态不允许使用系统后退键if (event.getKeyCode() == KeyEvent.KEYCODE_BACK&& event.getAction() == KeyEvent.ACTION_DOWN) {if (isLocked) {return true;}}return super.dispatchKeyEvent(event);}public static String change(int second) {int h = 0;int d = 0;int s = 0;int temp = second % 3600;if (second > 3600) {h = second / 3600;if (temp != 0) {if (temp > 60) {d = temp / 60;if (temp % 60 != 0) {s = temp % 60;}} else {s = temp;}}} else {d = second / 60;if (second % 60 != 0) {s = second % 60;}}return h + ":" + d + ":" + s;}}
Demo下载:http://download.csdn.net/detail/menglele1314/9383426

更多相关文章

  1. android中TextView嵌套在ScrollView中并自由滚动
  2. Android大图片加载处理
  3. android动态布局:用java代码实现LinearLayout以及TextView
  4. 短视频直播系统开发Android中常用控件
  5. android里,addContentView()动态增加view控件,并实现控件的顶部,中
  6. android 播放音频和视频
  7. Android(安卓)NullPointerException at android.text.BoringLayo
  8. android常用控件
  9. Android视频播放项目总结之 使用Android中的videoView自己定义,暂

随机推荐

  1. [置顶] 调用Android发短信接口Intent.ACT
  2. android Intent打开各种类型文件((PDF、wo
  3. 对View DrawingCache的理解
  4. Android(安卓)NDK文档之 Android(安卓)ND
  5. [Android] 代码实现按钮/图片自旋转(中心
  6. android双击返回键退出程序
  7. (20120808)(01)android菜单与对话框--之日期
  8. Android自学笔记(番外篇):全面搭建Linux环境
  9. 在AndroidManifest.xml文件中的android:w
  10. Android(安卓)防止点击事件连按,isFastCli