Android的MediaPlayer包含了Audio和Video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlaer来实现的。

首先看看MediaPlaer的生命周期

Android --- MediaPlayer的使用详解_第1张图片

实现流程 : Application–>Framework MediaPlayer.java–>jni–>Library MediaPlayer.cpp–> 解码 –>Driver–> 硬件

生命周期

Idle–>setDataSource–>Initialized–>prepare/prepareAsyn–>prepared–>start 、 pause 、 stop 、 seekTo

播放

private void play(String path){    if (null == mediaPlayer){    mediaPlayer = new MediaPlayer();    //设置准备监听    mediaPlayer.setOnPreparedListener(onPreparedListener);    //设置错误监听mediaPlayer.setOnErrorListener(onErrorListener);    //设置播放完毕监听    mediaPlayer.setOnCompletionListener(onCompletionListener);     } else {            mediaPlayer.reset();     }     //1、让MediaPlayer进入idle状态     //设置播放的数据源     try {         mediaPlayer.setDataSource(path);         //2、进入initialized状态         //准备         mediaPlayer.prepareAsync();     } catch (IOException e) {         e.printStackTrace();     }}private MediaPlayer.OnPreparedListener onPreparedListener = new MediaPlayer.OnPreparedListener() {    @Override    public void onPrepared(MediaPlayer mp) {        //3 、进入 onPrepared 状态 ( 准备完毕 ) ,可以去 start 、 pause 、 seekTo 、 stop        mp.start();    }};

控制:

case R.id.btn_play:    if(mPlayer == null){        play("/mnt/sdcard/Music/zmr.mp3");    } else {        if(!mPlayer.isPlaying()){            mPlayer.start();        }    }    break;case R.id.btn_pause:    if(null != mPlayer && mPlayer.isPlaying()){        mPlayer.pause();    }    break;case R.id.btn_stop:    if(null != mPlayer){        mPlayer.stop();        mPlayer.release();        mPlayer = null;    }    break;

mPlayer.isPlaying() 检测是否正在播放中
mPlayer.release() 释放资源,建议停止时使用
mPlayer.getDuration() 获取播放的音乐的总时间
mPlayer.getCurrentPosition() 获取当前播放的时间
mPlayer.seekTo(pos) 设置播放位置

关于播放进度

可以使用 Handler 的延迟发送消息的方式循环获取当前时间,更新进度条

1 、准备完毕时设置最大值

private MediaPlayer.OnPreparedListener onPreparedListener = new MediaPlayer.OnPreparedListener() {    @Override    public void onPrepared(MediaPlayer mp) {        //3 、进入 onPrepared 状态 ( 准备完毕 ) ,可以去 start 、 pause 、 seekTo 、 stop        // 获取总时间        mSeek.setMax(mp.getDuration());        mp.start();        // 更新播放时间        mHandler.sendEmptyMessageDelayed(MSG_UPDATE_POSITION,200);    }};

2 、定义 Handler 接收消息时更新,并且控制下一次获取的时间 ( 循环 )

private Handler mHandler = new Handler(){    @Override    public void handleMessage(Message msg) {        if(msg.what == MSG_UPDATE_POSITION){            if(mPlayer != null){                int pos = mPlayer.getCurrentPosition(); // 获取当前的播放时间                mSeek.setProgress(pos);                sendEmptyMessageDelayed(MSG_UPDATE_POSITION,200);            }        }    }};

注意:播放控制中的进度更新

// 暂停时停止更新if (null != mPlayer && mPlayer.isPlaying()) {    mHandler.removeMessages(MSG_UPDATE_POSITION);    mPlayer.pause();}// 播放时恢复更新if (!mPlayer.isPlaying()) {    mPlayer.start();    mHandler.sendEmptyMessageDelayed(MSG_UPDATE_POSITION,200);}// 停止时 ( 停止更新 ) 重置进度条if (null != mPlayer) {    mHandler.removeMessages(MSG_UPDATE_POSITION);    mPlayer.stop();    mPlayer.release();    mPlayer = null;    mSeek.setProgress(0);}

拖动进度条的控制

mSeek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {    @Override    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {    }    @Override    public void onStartTrackingTouch(SeekBar seekBar) {        if(mPlayer!=null && mPlayer.isPlaying()){            mHandler.removeMessages(MSG_UPDATE_POSITION);        }    }    @Override    public void onStopTrackingTouch(SeekBar seekBar) {        if(mPlayer!=null){            int pos = seekBar.getProgress(); // 获取拖动到的位置            mPlayer.seekTo(pos); // 设置播放位置            if(mPlayer.isPlaying()){                mHandler.sendEmptyMessageDelayed(MSG_UPDATE_POSITION,200);            }        }    }});

Activity界面跳转的另外一种写法
在布局按钮中添加Tag标记

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.xykj.mediademo.MainActivity">    <Button        android:id="@+id/btn_2_play"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="音乐播放器"        android:tag="com.xykj.mediademo.MusicPlayerActivity"/>LinearLayout>

在MainActivity 中的写法

    @Override    public void onClick(View v) {        try {            Class cls = Class.forName((String)(v.getTag()));            Intent it = new Intent(this,cls);            startActivity(it);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }

这样也可以实现点击跳转!!

更多相关文章

  1. Android 的状态栏设置图片填充或者颜色填充
  2. A20修改顶部状态栏 禁止跳转设置界面
  3. unity在android显示界面(UnityPlayerActivity)不重复加载且app退出
  4. android 应用程序全屏(没有状态栏和标题栏)
  5. Android 使用selector改变按钮状态实例详解
  6. android 锁屏界面处理
  7. Android 时间字符串 转成UTC时间转为指定时间的时间字符串

随机推荐

  1. android 如何从sqlite读取数据到spinner
  2. android 7.0 制作ota差分包
  3. MUI调用自定义插件(Android)
  4. Android中如何使用基于监听的事件处理(上)
  5. Android(安卓)带输入框的弹出框
  6. android调用NotificationManager.notify
  7. android edittxet 设置可点击不可编辑状
  8. android ------ Emulator: error: x86 em
  9. Android权限
  10. Joggler索引页