Android使用MediaPlayer播放音频

Android使用MediaPlayer播放音频

    • 一、目标
    • 二、最终实现
    • 三、接下来
    • 四、Finally

开发《Android高仿iOS Messages声音播放波形效果》完成后,TapePlayView已经实现了音频播放功能。但是结合RecyclerView使用时,会出现控件被回收,但音频要继续播放的问题。

这种场景下,MediaPlayer播放功能不应该关联到控件,TapePlayView应该只显示播放波形。

一、目标

将播放功能从TapePlayView中分离出来,使音频播放的生命周期脱离控件的生命周期。
Android使用MediaPlayer播放音频_第1张图片

二、最终实现

TapePlayView已经实现了播放功能,只需要将代码分离处理即可。

public class AudioPlayer {

    private int duration;
    private boolean isPlaying = false;

    private File targetFile;
    private MediaPlayer mMediaPlayer = null;
    private Consumer<AudioPlayer> mOnCompletionListener;

    public AudioPlayer() {

    }

    public void setTarget(File file) {
        this.targetFile = file;
    }

    public void setOnCompletionListener(Consumer<AudioPlayer> consumer) {
        this.mOnCompletionListener = consumer;
    }

    public boolean start() {
        if (targetFile == null) {
            return false;
        }

        mMediaPlayer = new MediaPlayer();

        try {
            mMediaPlayer.setDataSource(targetFile.getAbsolutePath());
            mMediaPlayer.prepare();
            mMediaPlayer.setOnCompletionListener(this::onCompletion);
            mMediaPlayer.setOnPreparedListener(mp -> mMediaPlayer.start());

            this.duration = mMediaPlayer.getDuration();
        } catch (IOException e) {
            e.printStackTrace();

            mMediaPlayer.stop();
            mMediaPlayer.reset();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }

        boolean result = (mMediaPlayer != null);
        this.isPlaying = result;

        return result;
    }

    public void stop() {
        this.isPlaying = false;
        this.duration = 0;

        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.reset();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

    public void resume() {
        if (mMediaPlayer != null) {
            this.isPlaying = true;

            mMediaPlayer.start();
        }
    }

    public void pause() {
        this.isPlaying = false;

        if (mMediaPlayer != null) {
            mMediaPlayer.pause();
        }
    }

    public boolean isRunning() {
        return (mMediaPlayer != null);
    }

    public boolean isPlaying() {
        return this.isPlaying;
    }

    public int getDuration() {
        if (mMediaPlayer == null) {
            return this.duration;
        }

        return mMediaPlayer.getDuration();
    }

    public int getCurrentPosition() {
        if (mMediaPlayer == null) {
            return 0;
        }

        return mMediaPlayer.getCurrentPosition();
    }

    public MediaPlayer getMediaPlayer() {
        return this.mMediaPlayer;
    }

    void onCompletion(MediaPlayer mp) {
        this.stop();

        if (mOnCompletionListener != null) {
            mOnCompletionListener.accept(this);
        }
    }

}

三、接下来

目前为止,已经实现了录音编辑器功能以及播放功能。

接下来需要处理的是声音相关的问题,包括

  1. 调高、调低音量
  2. 切换话筒、扬声器播放
  3. 靠近耳朵时自动切换到话筒播放
  4. 非播放时,靠近耳朵启动录音编辑器
  5. ……

四、Finally

稽首三界尊,皈依十方佛。
我今发宏愿,持此金刚经。
上报四重恩,下济三途苦。
若有见闻者,悉发菩提心。
尽此一报身,同生极乐国。

你可能感兴趣的:(神马笔记)