Android学习笔记--MediaPlayer基础使用的详解:

MediaPlayer具体方法介绍:

  •     void setDataSource(String path) 通过一个具体的路径来设置MediaPlayer的数据源,path可以是本地的一个路径,也可以是一个网络路径
  •     void setDataSource(Context context, Uri uri) 通过给定的Uri来设置MediaPlayer的数据源,这里的Uri可以是网络路径或是一个ContentProvider的Uri。
  •     void setDataSource(MediaDataSource dataSource) 通过提供的MediaDataSource来设置数据源
  •     void setDataSource(FileDescriptor fd) 通过文件描述符FileDescriptor来设置数据源
  •     int getCurrentPosition() 获取当前播放的位置
  •     int getAudioSessionId() 返回音频的session ID
  •     int getDuration() 得到文件的时间
  •     TrackInfo[] getTrackInfo() 返回一个track信息的数组
  •     boolean isLooping () 是否循环播放
  •     boolean isPlaying() 是否正在播放
  •     void pause () 暂停
  •     void start () 开始
  •     void stop () 停止
  •     void prepare() 同步的方式装载流媒体文件。
  •     void prepareAsync() 异步的方式装载流媒体文件。
  •     void reset() 重置MediaPlayer至未初始化状态。
  •     void release () 回收流媒体资源。
  •     void seekTo(int msec) 指定播放的位置(以毫秒为单位的时间)
  •     void setAudioStreamType(int streamtype) 指定流媒体类型
  •     void setLooping(boolean looping) 设置是否单曲循环
  •     void setNextMediaPlayer(MediaPlayer next) 当 当前这个MediaPlayer播放完毕后,MediaPlayer next开始播放
  •     void setWakeMode(Context context, int mode):设置CPU唤醒的状态。
  •     setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) 网络流媒体的缓冲变化时回调 **
  •     setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 网络流媒体播放结束时回调
  •     setOnErrorListener(MediaPlayer.OnErrorListener listener) 发生错误时回调 **
  •     setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当装载流媒体完毕的时候回调。

使用步骤:
1)获取MediaPlayer实例。
    静态方法:
     //下面不需要再setDataSource()和prepare();
     MediaPlayer mediaPlayer=MediaPlayer.create(this, R.raw.mysoul);//本地资源res.raw/mysoul
    动态方法:
     MediaPlayer mediaPlayer=new MediaPlayer();
2)设置数据源
      //本地资源res.raw/mysoul
        mediaPlayer.setDataSource(this, Uri.parse("android.resource://com.example.k555l.test/" + R.raw.mysoul));
      //网络资源,不要忘记添加网络访问权限
      //    <uses-permission android:name="android.permission.INTERNET"/>
      //mediaPlayer.setDataSource("http://www.xxxx.com/yyyy.mp3");
      //本地存储资源,外部资源访问权限
      //    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
      //    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      //mediaPlayer.setDataSource("/sdcard/leesang.mp3");

     //指定流媒体类型
       mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
3)装载资源
       mediaPlayer.prepare();//同步加载资源。
       //异步加载资源,需要监听是否加载完成,才可以播放,当资源文件较大或者网络资源的时候使用。
       mediaPlayer.prepareAsync();
4)播放
      mediaPlayer.start();
5)回收资源
      mediaPlayer.release();
      mediaPlayer = null;

MediaPlayer和SeekBar控制、显示进度的简单例子:

/***
 * 初始化
 */
void initMediaPlayer() {
    mediaPlayer = new MediaPlayer();//创建实例
    try {
        mediaPlayer.setDataSource(this, Uri.parse("android.resource://com.example.k555l.test/" + R.raw.mysoul));//设置数据源
        mediaPlayer.prepareAsync();//异步加载资源,需要监听是否加载完成,才可以播放
    } catch (IOException e) {
        e.printStackTrace();
    }
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置播放类型
    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {//异步装载监听
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
            //加载完成后,让按钮变为可点击状态
            btn_play.setEnabled(true);
        }
    });

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer me) {
            // 在播放完毕被回调
            //Toast.makeText(MainActivity.this, "播放完了", Toast.LENGTH_SHORT).show();

        }
    });
}

 /***
     * 进度条
     */
    @SuppressLint("HandlerLeak")
    void initSeekbar() {
        seekBar.setMax(100);//最大进度值
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            // 该方法拖动进度条进度改变的时候调用
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean fromuser) {

            }


            //该方法拖动进度条开始拖动的时候调用。
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            // 该方法拖动进度条停止拖动的时候调用
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                mediaPlayer.seekTo(seekBar.getProgress() * mediaPlayer.getDuration() / 100);
            }
        });
        //控制音量,有需要,自行添加设置
//        AudioManager audioManager=(AudioManager) getSystemService(AUDIO_SERVICE);
//        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,10,AudioManager.FLAG_SHOW_UI);

        handler = new Handler() {
            @Override
            public void dispatchMessage(Message msg) {
                if (msg.what == 1 && mediaPlayer != null)
                    //进度条更新进度
                    seekBar.setProgress(mediaPlayer.getCurrentPosition() * 100 / mediaPlayer.getDuration());// 当前/总数*100
            }
        };


@Override
public void onClick(View view) {//按钮的点击事件处理
    switch (view.getId()) {
        case R.id.btn_play:
            if (mediaPlayer != null && !mediaPlayer.isPlaying())
                mediaPlayer.start();
            break;
        case R.id.btn_pause:
            if (mediaPlayer != null && mediaPlayer.isPlaying())
                mediaPlayer.pause();
            break;
        case R.id.btn_stop:
            if (mediaPlayer != null && mediaPlayer.isPlaying())
                //mediaPlayer.stop();
                stop();
            break;
        default:
            break;
    }
}

// 在停止播放的是代码应这样写才可以在下次播放时重新开始播放,
//如果不需要可直接mediaPlayer.stop();
private void stop() {
    if (mediaPlayer != null) {//mediaplayer 是MediaPlayer的 instance
        mediaPlayer.stop();
       // mediaPlayer.prepare();
        mediaPlayer.prepareAsync();//stop后下次重新播放要首先进入prepared状态
        mediaPlayer.seekTo(0);//须将播放时间设置到0;这样才能在下次播放是重新开始,否则会继续上次播放
    }
}

另外MediaPlayer操作的是流媒体,有可能中间一段因为解析或者源文件错误等问题,造成中间一段无法播放问题,这时候要为MediaPlayer注册回调函数setOnErrorListener()来设置出错之后的解决办法,一般重新播放或者播放下一个流媒体。
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值