这些天一直都在写一个视频播放器,碰到了很多意想不到的问题,在这里,我把部分代码分享一下:
package com.xbys; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import android.annotation.SuppressLint; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.view.Choreographer; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Chronometer; import android.widget.GridView; import android.widget.ImageButton; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import com.xbys.io.StreamTools; import com.xbys.network.NetWorkType; import com.xbys.timer.GetVideotime; public class MainActivity extends Activity { private GridView gridView; String[] imageName = {"学习目标","知识内容","实践","知识结构","学习指南","练习","案例","常见问题" }; int[] image = {R.drawable.xuexi3,R.drawable.xuexi1,R.drawable.xuexi2,R.drawable.xuexi3, R.drawable.xuexi5,R.drawable.xuexi6,R.drawable.xuexi7,R.drawable.xuexi3, }; private static final int CHANGE = 0; private SlidingMenu menu; private TextView tv_content = null ; InputStream is; String detail; private SurfaceView sv; private ImageButton video_play ; private ImageButton video_screen; MediaPlayer mediaPlayer; private int currentPosition = 0 ; private boolean isplay = true; private PlayVideo playVideo; private SeekBar seekBar; private int max; private int i = 1; private int j = 1; int second = 0; int minute = 0; private int flag1; private int flag2; private int progress; private int firstFlag = 0; private boolean isflag = true; private int position3; private boolean isPlaying = true; private TextView timer_long; private TextView play_timer; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); seekBar = (SeekBar)findViewById(R.id.seekBar); timer_long = (TextView) findViewById(R.id.timer_long); play_timer = (TextView)findViewById(R.id.play_timer); seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub progress = seekBar.getProgress(); isflag = false; flag1 = progress / 1006; firstFlag++; if(firstFlag!=1){ j = 1; second = 0; minute = 0; } if(mediaPlayer!=null&&mediaPlayer.isPlaying()){ mediaPlayer.seekTo(progress); } } @Override public void onStartTrackingTouch(SeekBar arg0) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar seekBar, final int flag, boolean arg2) { // TODO Auto-generated method stub if(isflag){ if (flag / 1006 == i) { i++; second++; if (second == 60) { minute++; second = 0; } if(second<10){ play_timer.setText(minute + ":" +"0"+ second); }else{ play_timer.setText(minute + ":" + second); } } }else{ /** * 控制进度条 * * */ // 小于60s时 if (flag1 < 60) { //second = flag1; /* if (second < 10) { play_timer.setText(minute + ":" + "0" + second); } else { play_timer.setText(minute + ":" + second); }*/ if (flag/1006-flag1 == j) { System.out.println("是否执行到这里====="+j); System.out.println("是否执行到这里====="+second); j++; second = flag1+j; if (second == 60) { minute++; second = 0; } if (second < 10) { play_timer.setText(minute + ":" + "0" + second); } else { play_timer.setText(minute + ":" + second); } } } // 大于60s if (flag1 >= 60) { flag2 = flag1/60; minute = flag2; second = flag2%60; if (second < 10) { play_timer.setText(minute + ":" + "0" + second); } else { play_timer.setText(minute + ":" + second); } if (flag/1006-flag1 == j) { j++; second = second+j; if (second == 60) { minute++; second = 0; } if (second < 10) { play_timer.setText(minute + ":" + "0" + second); } else { play_timer.setText(minute + ":" + second); } } } /** * 控制进度条结束 */ } if(flag<max&&flag>max-500){ i = 1; second = 0; minute = 0; } } }); gridView = (GridView) findViewById(R.id.gridview); video_play = (ImageButton) findViewById(R.id.video_play); video_screen = (ImageButton)findViewById(R.id.screen); video_play.setBackground(getResources().getDrawable(R.drawable.play)); video_play.setOnClickListener(new VideoPlayerListener()); sv = (SurfaceView) findViewById(R.id.sv); sv.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //回调方法 sv.getHolder().addCallback(new Callback(){ @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder arg0) { // TODO Auto-generated method stub if(currentPosition>0){ new PlayVideo(currentPosition).start(); } } @Override public void surfaceDestroyed(SurfaceHolder arg0) { // TODO Auto-generated method stub if(mediaPlayer!=null&&mediaPlayer.isPlaying()){ currentPosition = mediaPlayer.getCurrentPosition(); stop(); } }} ); //侧拉菜单 menu = new SlidingMenu(this); menu.setMode(SlidingMenu.RIGHT); menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); menu.setShadowWidthRes(R.dimen.activity_horizontal_margin); //menu.setShadowDrawable(R.drawable.yuefu); menu.setBehindOffsetRes(R.dimen.activity_horizontal_margin); menu.setFadeDegree(0.5f); menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT); menu.setMenu(R.layout.slidingmenu); //将资源文件夹中的文本读到tv_content上 tv_content = (TextView) findViewById(R.id.tv_content); //变换标题栏的背景 getActionBar().setBackgroundDrawable(this.getBaseContext(). getResources().getDrawable(R.drawable.skinpic_blue)); getActionBar().show(); ArrayList<HashMap<String, Object>> list=new ArrayList<HashMap<String,Object>>(); for(int i=0;i<8;i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemImage", image[i]); map.put("imageName", imageName[i]); list.add(map); } SimpleAdapter adapter = new SimpleAdapter(this, list,R.layout.griview_item, new String[]{"ItemImage","imageName"}, new int[]{R.id.gridview_imageview,R.id.gridview_textview}); gridView.setAdapter(adapter); gridView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub switch (position) { case 0: detail = StreamTools.getStream("resources/dbms.txt", MainActivity.this); tv_content.setText(detail); menu.showMenu(); break; case 1: detail = StreamTools.getStream("resources/content_1.txt", MainActivity.this); tv_content.setText(detail); menu.showMenu(); break; case 2: detail = StreamTools.getStream("resources/content_1.txt", MainActivity.this); tv_content.setText(detail); menu.showMenu(); break; case 3: detail = StreamTools.getStream("resources/content_1.txt", MainActivity.this); tv_content.setText(detail); menu.showMenu(); break; case 4: detail = StreamTools.getStream("resources/content_1.txt", MainActivity.this); tv_content.setText(detail); menu.showMenu(); break; case 5: detail = StreamTools.getStream("resources/content_1.txt", MainActivity.this); tv_content.setText(detail); menu.showMenu(); break; case 6: detail = StreamTools.getStream("resources/content_1.txt", MainActivity.this); tv_content.setText(detail); menu.showMenu(); break; case 7: detail = StreamTools.getStream("resources/content_1.txt", MainActivity.this); tv_content.setText(detail); menu.showMenu(); break; default: break; } } }); } class PlayVideo extends Thread{ int currentPosition; public PlayVideo(int currentPosition) { super(); this.currentPosition = currentPosition; } @Override public void run() { // TODO Auto-generated method stub play(currentPosition); super.run(); } } class VideoPlayerListener implements OnClickListener{ @SuppressWarnings("deprecation") @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.video_play: new NetWorkType().isWifi(MainActivity.this); if(isplay){ video_play.setBackground(getResources().getDrawable(R.drawable.pause)); new PlayVideo(currentPosition).start(); isplay = false; }else{ pause(); video_play.setBackground(getResources().getDrawable(R.drawable.play)); isplay = true; } break; /*case R.id.screen: ViewGroup.LayoutParams lp = sv.getLayoutParams(); lp.height = LayoutParams.MATCH_PARENT; lp.width = LayoutParams.MATCH_PARENT; System.out.println(lp.width); sv.setLayoutParams(lp); break;*/ default: break; } } } /** * 播放视频 * @param currentPosition */ private void play(final int currentPosition2) { String path = "http://192.168.194.51:8080/xbys/oppop.mp4"; try { mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDisplay(sv.getHolder()); mediaPlayer.setDataSource(path); mediaPlayer.prepareAsync(); // mediaPlayer.seekTo(currentPosition); mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { // TODO Auto-generated method stub mediaPlayer.start(); mediaPlayer.seekTo(currentPosition2); max = mediaPlayer.getDuration(); String timer = new GetVideotime().TimeLong(max); timer_long.setText(timer); new Thread(){ public void run() { seekBar.setMax(max); while(mediaPlayer!=null&&mediaPlayer.isPlaying()){ position3 = mediaPlayer.getCurrentPosition(); seekBar.setProgress(position3); } try { Thread.sleep(500); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }; }.start(); } }); mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer arg0) { // TODO Auto-generated method stub mediaPlayer.seekTo(0); video_play.setBackground(getResources().getDrawable(R.drawable.play)); seekBar.setProgress(0); play_timer.setText(0+":"+"00"); //isplay = true; } }); } catch (Exception e) { // TODO Auto-generated catch block Toast.makeText(this, "播放失败", 0).show(); e.printStackTrace(); } } /** * 停止播放音乐 */ private void stop() { // TODO Auto-generated method stub if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } } private void pause() { // TODO Auto-generated method stub if (mediaPlayer != null && mediaPlayer.isPlaying()) { currentPosition = mediaPlayer.getCurrentPosition(); mediaPlayer.pause(); } } @Override protected void onDestroy() { // TODO Auto-generated method stub stop(); super.onDestroy(); } }