音视频

Android音视频<第三篇>:简单音频播放实现

2019-09-16  本文已影响0人  NoBugException

播放音频需要借助MediaPlayer对象,MediaPlayer可以播放本地音频和网络音频。文本的目的是为了尝试使用MediaPlayer实现最简单的音频播放功能,下一篇将全面说明MediaPlayer对象。

实现音频播放功能分为以下步骤:

创建MediaPlayer对象指定音频文件资源添加监听预处理播放暂停操作销毁资源

[第一步]:创建MediaPlayer对象

    MediaPlayer mediaPlayer = new MediaPlayer();

[第二步]:指定音频文件资源

            try {
                File file = new File(Environment.getExternalStorageDirectory(), "music_test.mp3");
                mediaPlayer.setDataSource(file.getPath());
            } catch (IOException e) {
                e.printStackTrace();
            }

当然,别忘了添加读写外部存储权限。

[第三步]:添加监听

添加预处理完成监听程序

    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {

        }
    });

播放完成监听

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {

        }
    });

播放异常监听

    mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            return false;
        }
    });

[第四步]:预处理

            try {
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (IllegalStateException e){
                mediaPlayer.start();
                e.printStackTrace();
            }

每次执行预处理方法前必须重新指定音频文件资源路径,当执行预处理方法后,预处理完成的回调方法就会执行,这时,开始播放音频。

[第五步]:播放暂停操作

            //播放
            mediaPlayer.start();
            //暂停
            mediaPlayer.pause();

[第六步]:销毁MediaPlayer对象资源

@Override
protected void onDestroy() {
    super.onDestroy();

    if(mediaPlayer != null){
        //释放资源
        mediaPlayer.release();

        mediaPlayer.setOnPreparedListener(null);
        mediaPlayer.setOnCompletionListener(null);
        mediaPlayer.setOnErrorListener(null);
    }

}

当然,释放MediaPlayer资源的同时顺便将监听置为null,防止因为观察者设计模式造成的内存泄漏。

注意事项

(1)播放音频必须执行音频资源的路径(本地路径或者网络路径);
(2)指定音频资源的路径后,必须告诉MediaPlayer对象,初始化已经准备好了,可以进行音频操作了,也就是执行mediaPlayer.prepare()方法,预处理有一个预处理完成的监听,执行mediaPlayer.prepare()方法后会触发预处理完成监听,只有预处理完成之后才可以对音频进行播放暂停等操作;
(3)如果连续执行mediaPlayer.start()方法时,必须要等到前面一个音频播放完成之后才能重新播放,所以一般会有这样的判断

            if(!mediaPlayer.isPlaying()){
                mediaPlayer.start();
            }

(4)当重新指定播放资源时,必须执行

    mediaPlayer.reset();

    mediaPlayer.prepare();

(5)为了防止内存泄漏,需要在onDestroy里面释放资源,代码上面已有。

[本章完...]

上一篇下一篇

猜你喜欢

热点阅读