本文来自http://blog.csdn.net/hellogv/?,引用必须注明出处!?
??????? 前面写了十四篇关于界面的入门文章,大家都看完和跟着练习之后,对于常用的Layout和View都会有一定的了解了,接下来的文章就不再强调介绍界面了,而是针对具体的常见功能而展开。
????????本文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。
???????? 先贴出本文程序运行结果的截图,上面是播放/停止音频,可用SeekBar来调进度,下面是播放/停止视频,也是用SeekBar来调进度:
?
main.xml的源码:
- <?xml?version="1.0"?encoding="utf-8"?>??
- <LinearLayout?android:id="@+id/LinearLayout01"??
- ????android:layout_width="fill_parent"?android:layout_height="fill_parent"??
- ????xmlns:android="http://schemas.android.com/apk/res/android"??
- ????android:orientation="vertical">??
- ????<SeekBar?android:id="@+id/SeekBar01"?android:layout_height="wrap_content"??
- ????????android:layout_width="fill_parent"></SeekBar>??
- ????<LinearLayout?android:id="@+id/LinearLayout02"??
- ????????android:layout_width="wrap_content"?android:layout_height="wrap_content">??
- ????????<Button?android:id="@+id/Button01"?android:layout_width="wrap_content"??
- ????????????android:layout_height="wrap_content"?android:text="播放音频"></Button>??
- ????????<Button?android:id="@+id/Button02"?android:layout_width="wrap_content"??
- ????????????android:layout_height="wrap_content"?android:text="停止播放"></Button>??
- ????</LinearLayout>??
- ????<SeekBar?android:id="@+id/SeekBar02"?android:layout_height="wrap_content"??
- ????????android:layout_width="fill_parent"></SeekBar>??
- ??
- ????<SurfaceView?android:id="@+id/SurfaceView01"??
- ????????android:layout_width="fill_parent"?android:layout_height="250px"></SurfaceView>??
- ????<LinearLayout?android:id="@+id/LinearLayout02"??
- ????????android:layout_width="wrap_content"?android:layout_height="wrap_content">??
- ????????<Button?android:layout_width="wrap_content"??
- ????????????android:layout_height="wrap_content"?android:id="@+id/Button03"??
- ????????????android:text="播放视频"></Button>??
- ????????<Button?android:layout_width="wrap_content"??
- ????????????android:layout_height="wrap_content"?android:text="停止播放"?android:id="@+id/Button04"></Button>??
- ????</LinearLayout>??
- </LinearLayout>??
?
?
本文程序的源码,有点长:
- package?com.testMedia;??
- ??
- import?java.io.IOException;????
- import?java.util.Timer;??
- import?java.util.TimerTask;??
- import?android.app.Activity;????
- import?android.media.AudioManager;??
- import?android.media.MediaPlayer;??
- import?android.os.Bundle;????
- import?android.view.SurfaceHolder;??
- import?android.view.SurfaceView;??
- import?android.view.View;????
- import?android.widget.Button;????
- import?android.widget.SeekBar;??
- import?android.widget.Toast;????
- ??
- ??
- public?class?testMedia?extends?Activity?{??
- ??????/**?Called?when?the?activity?is?first?created.?*/???
- ??
- ????private?SeekBar?skb_audio=null;??
- ????private?Button?btn_start_audio?=?null;????
- ????private?Button?btn_stop_audio?=?null;??
- ??
- ????private?SeekBar?skb_video=null;??
- ????private?Button?btn_start_video?=?null;????
- ????private?Button?btn_stop_video?=?null;??
- ????private?SurfaceView?surfaceView;???
- ????private?SurfaceHolder?surfaceHolder;???
- ??????
- ????private?MediaPlayer?m?=?null;????
- ????private?Timer?mTimer;??
- ????private?TimerTask?mTimerTask;??
- ??????
- ????private?boolean?isChanging=false;//互斥变量,防止定时器与SeekBar拖动时进度冲突??
- ?????@Override????
- ????public?void?onCreate(Bundle?savedInstanceState)?{????
- ????????super.onCreate(savedInstanceState);????
- ????????setContentView(R.layout.main);????
- ??????????
- ????????//----------Media控件设置---------//??
- ????????m=new?MediaPlayer();??
- ??????????
- ????????//播放结束之后弹出提示??
- ????????m.setOnCompletionListener(new?MediaPlayer.OnCompletionListener(){??
- ????????????@Override??
- ????????????public?void?onCompletion(MediaPlayer?arg0)?{??
- ????????????????Toast.makeText(testMedia.this,?"结束",?1000).show();??
- ????????????????m.release();??
- ????????????}??
- ????????});??
- ??????????
- ??????//----------定时器记录播放进度---------//??
- ????????mTimer?=?new?Timer();??
- ????????mTimerTask?=?new?TimerTask()?{??
- ????????????@Override??
- ????????????public?void?run()?{???
- ????????????????if(isChanging==true)??
- ????????????????????return;??
- ??????????????????
- ????????????????if(m.getVideoHeight()==0)??
- ????????????????????skb_audio.setProgress(m.getCurrentPosition());??
- ????????????????else???
- ????????????????????skb_video.setProgress(m.getCurrentPosition());??
- ????????????}??
- ????????};??
- ??
- ????????mTimer.schedule(mTimerTask,?0,?10);??
- ??????????
- ????????btn_start_audio?=?(Button)?this.findViewById(R.id.Button01);????
- ????????btn_stop_audio?=?(Button)?this.findViewById(R.id.Button02);????
- ????????btn_start_audio.setOnClickListener(new?ClickEvent());??
- ????????btn_stop_audio.setOnClickListener(new?ClickEvent());??
- ????????skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);??
- ????????skb_audio.setOnSeekBarChangeListener(new?SeekBarChangeEvent());??
- ??????????
- ????????btn_start_video?=?(Button)?this.findViewById(R.id.Button03);????
- ????????btn_stop_video?=?(Button)?this.findViewById(R.id.Button04);????
- ????????btn_start_video.setOnClickListener(new?ClickEvent());??
- ????????btn_stop_video.setOnClickListener(new?ClickEvent());??
- ????????skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);??
- ????????skb_video.setOnSeekBarChangeListener(new?SeekBarChangeEvent());??
- ????????surfaceView?=?(SurfaceView)?findViewById(R.id.SurfaceView01);??
- ????????surfaceHolder?=?surfaceView.getHolder();??
- ????????surfaceHolder.setFixedSize(100,?100);??
- ????????surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);??
- ????}????
- ???????
- ??/*?
- ???*?按键事件处理?
- ???*/??
- ??class?ClickEvent?implements?View.OnClickListener{??
- ????@Override??
- ????public?void?onClick(View?v)?{??
- ????????if(v==btn_start_audio)??
- ????????{??
- ????????????m.reset();//恢复到未初始化的状态??
- ????????????m=MediaPlayer.create(testMedia.this,?R.raw.big);//读取音频??
- ????????????skb_audio.setMax(m.getDuration());//设置SeekBar的长度??
- ????????????try?{?????????????????????
- ????????????????m.prepare();????//准备??
- ????????????}?catch?(IllegalStateException?e)?{???????????
- ????????????????//?TODO?Auto-generated?catch?block????????????????
- ????????????????e.printStackTrace();??????????????????
- ????????????}?catch?(IOException?e)?{?????????????
- ????????????????//?TODO?Auto-generated?catch?block????????????????
- ????????????????e.printStackTrace();??????????????????
- ????????????}?????????
- ????????????m.start();??//播放??
- ????????}??
- ????????else?if(v==btn_stop_audio?||?v==btn_stop_video)??
- ????????{??
- ????????????m.stop();??
- ????????}??
- ????????else?if(v==btn_start_video)??
- ????????{??
- ????????????m.reset();//恢复到未初始化的状态??
- ????????????m=MediaPlayer.create(testMedia.this,?R.raw.test);//读取视频??
- ????????????skb_video.setMax(m.getDuration());//设置SeekBar的长度??
- ????????????m.setAudioStreamType(AudioManager.STREAM_MUSIC);??
- ????????????m.setDisplay(surfaceHolder);//设置屏幕??
- ??????????????
- ????????????try?{??
- ????????????????m.prepare();??
- ??????????????????
- ????????????}?catch?(IllegalArgumentException?e)?{??
- ????????????????//?TODO?Auto-generated?catch?block??
- ????????????????e.printStackTrace();??
- ????????????}?catch?(IllegalStateException?e)?{??
- ????????????????//?TODO?Auto-generated?catch?block??
- ????????????????e.printStackTrace();??
- ????????????}?catch?(IOException?e)?{??
- ????????????????//?TODO?Auto-generated?catch?block??
- ????????????????e.printStackTrace();??
- ????????????}??
- ????????????m.start();??
- ????????}??
- ????}??
- ??}??
- ????
- ??/*?
- ???*?SeekBar进度改变事件?
- ???*/??
- ??class?SeekBarChangeEvent?implements?SeekBar.OnSeekBarChangeListener{??
- ??
- ????@Override??
- ????public?void?onProgressChanged(SeekBar?seekBar,?int?progress,??
- ????????????boolean?fromUser)?{??
- ????????//?TODO?Auto-generated?method?stub??
- ??????????
- ????}??
- ??
- ????@Override??
- ????public?void?onStartTrackingTouch(SeekBar?seekBar)?{??
- ????????isChanging=true;??
- ????}??
- ??
- ????@Override??
- ????public?void?onStopTrackingTouch(SeekBar?seekBar)?{??
- ????????m.seekTo(seekBar.getProgress());??
- ????????isChanging=false;?????
- ????}??
- ????????
- ??}??
- ??
- }??
?
?