Android多媒体之MediaPlayer

 

         Android应用增加动画,视频,音乐等多媒体功能,因此为手机提供音频录制,播放,视频录制,播放的功能十分重要。Android提供了常见音频,视频的编码,解码机制,Android支持的音频格式有MP3,WAV3GP等,支持的视频格式有MP43GP等。                                             Android提供了这些多媒体的支持类,可以非常方便地在手机应用中播放音频,视频等。这些多媒体数据可以来自Android应用的资源文件,也可以来自外部存储器上的文件,也可以来自网络的文件流。

      不仅如此,Android也提供了对摄像头,麦克风的支持,因此也可以十分方便地从外部采集照片,视频,音频等多媒体信息。

 

——音频和视频的播放

——MediaPlayer播放音频

  1)MediaPalyer进行播放控制的方式:

     start():开始或者恢复播放

     stop():停止播放

     pause():暂停播放

  2)MediaPlayer装载指定音频文件的方式

      static MediaPlayer create(Content,Uri):从指定Uri来装载音频文件,并返回新创建的MediaPlayer对象。

      static MediaPlayer create(Content,int resid):redid资源ID来装载音频文件,并返回新创建的MediaPlayer对象。

    上面这两个方法使用起来很简单,但这两个方法每次都会返回新的MediaPlayer.如果程序需要播放多个音频文件,使用该方法就不太合适了。此时可通过setDataSource方法装载指定的音频文件。

      MediaPlayer m = new MediaPlayer():只需要创建一个对象

      setDataSource(String path):指定装载path路径所代表的文件

      setDataSource(FileDescriptor fs,long offset,long length):指定装载fd所代表的文件中从offset开始,长度为length的文件内容。

      setDataSource(FileDescriptor fd):指定装载fd所代表的文件                    

 

     setDataSource(Context,Uri):指定装载Uri所代表的文件

    执行setDataSource方法之后,MediaPlayer并未真正装载那些音频文件,还需要调用prepare()方法准备装载音频。

 3)播放应用raw的资源文件

    MediaPlayer m=MediaPlayer.create(this,R.raw.apple);

    m.start();

 4)播放应用raw的资源文件

      MediaPlayer m=new  MediaPlayer();

      m.setDataSource(Context,Uri.parse(

        "android.resource://"+getPackageName()+"/"+R.raw.apple"))

 5)播放应用的原始资源文件

    a)调用ContextgetAssets()获取AssetManager;

    b)调用AssetManageropenFd(String name)方法打开指定的原生资源.返回AssetFileDescriptor对象

    c)调用AssetFileDescriptorgetFileDescriptor()方法来获取音频文件的FileDescriptor.

    d)创建MediaPlayer对象,调用setDataSource(FileDescriptor)方法。

    e)调用MediaPlayerprepare()方法准备音频

    f)调用MediaPlayerstart(),stop(),pause()方法控制播放即可

  5)播放外部存储器上音频文件

    a)创建MediaPlayer对象,调用setDataSource("/sdcard/apple.mp3")

    b)调用MediaPlayer对象的prepare()方法

    c)调用MediaPlayerstart(),stop(),pause()方法控制播放即可

  6)播放来自网络的音频文件

    a)根据网络上的音频文件所在的位置创建Uri对象。

      Uri  uri = Uri.parse("http://www.baidu.com/song.mp3");

    b)创建MediaPlayer对象,调用setDataSource(Context,Uri);

    c)调用MediaPlayer对象的prepare()方法

    d)调用MediaPlayerstart(),stop(),pause()方法控制播放即可

 7)如播放下一首歌曲的代码:

   mPlayer.reset();//空闲状态

   mPlayer.setDataSource("/sdcard/gequ.mp3");

   mPlayer.prepare();

   mPlayer.start();

 8)MediaPlayer还提供了事件监听器的方法

    setOnCompletionListener():播放完成事件绑定事件监听器

    setOnErrorListener():播放错误事件绑定事件监听器

    setOnPreparedListener():调用prepare()方法时触发该监听器

    setOnSeekCompleteListener():调用seek()方法时触发该监听器

  9)Mediaplayer除了调用prepare()方法准备声音之外,

  还可以调用

     prepareAsync()来准备声音,他们的区别在于:

     prepareAsync()是异步的,它不会阻塞当前的UI线程。

  10)MediaPlayer的状态图

     reset():清空MediaPlayer中的数据

     setDataSource():设置音频数据

     prepare():准备装载音频数据

     prepareAsync():准备装载音频数据(异步)

     seekTo():重新定位到音频数据的什么位置,单位毫秒

     seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。

     start():

     pause():

     stop():

     release():释放MediaPlayer资源

  

 11)其他的方法

      setLooping(true):是否重复播放

      setAudioStreamType()设置使用的音频流

A(播放音乐的界面)—>B

onPause()—>onCreate,onStart/onResume

—>onStop

实例:


先看效果吧:



接下来我就说下步骤:

1.音乐路径:

我们要把播放的音乐文件放在虚拟机的SD卡中,要到第一个0目录下面,按照下面这个图来~


2.播放音乐要MediaPlayer

MediaPlayer mediaPlayer=new MediaPlayer();

3.音乐的声音控制

AudioManager audioManager=(AudioManager) getSystemService(AUDIO_SERVICE);

4.音乐的开始与暂停

public void start(View view){mediaPlayer.start();new Thread(){        public void run() {        while(true){        try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//一秒        Message msg=handler.obtainMessage();msg.what=0x123;handler.sendMessage(msg);        }        };        }.start();}    public void stop(View view){mediaPlayer.pause();}
5.布局:

    
6.Activity:

public class MainActivity extends Activity {private SeekBar sb1,sb2;private MediaPlayer mediaPlayer;private TextView tv;private AudioManager audioManager;    private Handler handler =new Handler(){    //收到Handler发回的消息被回调    public void handleMessage(Message msg) {         //更新UI组件         if(msg.what==0x123){        int current=mediaPlayer.getCurrentPosition();        sb1.setProgress(current);      }       }    };public void start(View view){mediaPlayer.start();new Thread(){        public void run() {        while(true){        try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//一秒        Message msg=handler.obtainMessage();msg.what=0x123;handler.sendMessage(msg);        }        };        }.start();}    public void stop(View view){mediaPlayer.pause();}           @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sb1=(SeekBar) findViewById(R.id.sb1);sb2=(SeekBar) findViewById(R.id.sb2);tv=(TextView) findViewById(R.id.tv);//实例了一个mediaplayer,并给它装在了音乐/*//这个方法使用起来很简单//但是这俩个方法每次都会返回新的MediaPlayer//如果程序需要播放多个音频文件//使用该方法不合适mediaPlayer=mediaPlayer.create(this, R.raw.music);*/mediaPlayer=new MediaPlayer();//加载资源文件try {String path=Environment.getExternalStorageDirectory().getAbsolutePath()+"/music.mp3";mediaPlayer.setDataSource(path);/*mediaPlayer.setDataSource(this, Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.music));*/    //如果是setDataSource,那么调用完这个文件之后,音频文件没有真正的加载//要调用prepare方法//异步的加载方式//mediaPlayer.prepareAsync();mediaPlayer.prepare();//设置循环播放mediaPlayer.setLooping(false);//mediaPlayer.setOnErrorListener(listener);//1.setLooping --false   //2.在播放完成时触发mediaPlayer.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {// TODO Auto-generated method stub//加载下一首Toast.makeText(MainActivity.this, "播放完成", 0).show();}});tv.setText(convert(mediaPlayer.getDuration()));sb1.setMax(mediaPlayer.getDuration());sb1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub//mediaPlayer.start();}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {// TODO Auto-generated method stubif(fromUser){mediaPlayer.seekTo(progress);}}});audioManager=(AudioManager) getSystemService(AUDIO_SERVICE);sb2.setMax(audioManager.getStreamMaxVolume(audioManager.STREAM_MUSIC));sb2.setProgress(audioManager.getStreamMaxVolume(audioManager.STREAM_MUSIC));sb2.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {// TODO Auto-generated method stub//一句话audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, AudioManager.FLAG_SHOW_UI);}});} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubif(mediaPlayer!=null&&mediaPlayer.isPlaying()){mediaPlayer.stop();mediaPlayer.reset();mediaPlayer=null;//回收资源}super.onDestroy();}private String convert(int duration){//总秒int second=duration/1000;//总分int minute=second/60;//剩余秒数int miao=second%60;return minute+":"+miao;}}





更多相关文章

  1. Android(安卓)onTouchEvent, onClick及onLongClick的调用机制
  2. Android中Intent的显示和隐式使用
  3. Android应用程序框架层和系统运行库层日志系统源代码分析
  4. 事件机制(2)--Android(安卓)onTouchEvent, onClick及onLongClick的
  5. Android(安卓)Cannas.drawTextView 方法坐标问题
  6. Android(安卓)ActionBar的源代码分析(三)
  7. Android(安卓)P 调用隐藏API限制原理
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Andriod ADB Interface驱动安装失败Confi
  2. Android的消息机制
  3. 绿色守护简单使用教程
  4. Android(安卓)IPC(进程间通信)
  5. android 实现欢迎界面
  6. Android(安卓)10、11 存储完全适配(上)
  7. Android周报第二十期
  8. Android(安卓)在百度地图上显示自己的实
  9. 简单了解XML 树结构
  10. 简单了解XML 树结构