仿微信语音消息的录制和播放

仿微信语音消息的录制和播放

一、简述

效果:

实现功能:

  1. 长按Button时改变Button显示文字,弹出Dialog(动态更新音量),动态生成录音文件,开始录音;
  2. 监听手指动作,规定区域。录音状态下手指划出规定区域取消录音,删除生成的录音文件;
  3. 监听手指动作。当手指抬起时,判断是否开始录音,录音时长是否过短,符合条件则提示录音时长过短;正常结束时通过回调返回该次录音的文件路径和时长。
    4.点击录音列表的item时,播放动画,播放对应的音频文件。

主要用到4个核心类:

  1. 自定义录音按钮(AudioRecordButton);
  2. 弹框管理类(DialogManager);
  3. 录音管理类(AudioManager)。

1.AudioRecordButton状态:

  • 1.STATE_NORMAL:普通状态
  • 2.STATE_RECORDING:录音中
  • 3.STATE_CANCEL:取消录音

2.DialogManager状态:

  • 1.RECORDING:录音中
  • 2.WANT_TO_CANCEL:取消录音
  • 3.TOO_SHORT:录音时间太短

3.AudioManager:

  • 1.prepare():准备状态
  • 2.cancel():取消录音
  • 3.release():正常结束录音
  • 4.getVoiceLevel():获取音量

核心逻辑:

自定义Button,重写onTouchEvent()方法。

伪代码:

class AudioRecorderButton{
    onTouchEvent(){
        DOWN:
            changeButtonState(STATE_RECORDING);
                                                                          | DialogManager.showDialog(RECORDING)
            触发LongClick事件(AudioManager.prepare() --> end prepared -->  |                                                     );
                                                                          | getVoiceLevel();//开启一个线程,更新Dialog上的音量等级 

        MOVE:
            if(wantCancel(x,y)){
                DialogManager.showDialog(WANT_TO_CANCEL);更新Dialog
                changeButtonState(STATE_WANT_TO_CANCEL);更新Button状态
            }else{
                DialogManager.showDialog(WANT_TO_CANCEL);
                changeButtonState(STATE_RECORDING);
            }

         UP:
            if(wantCancel == curState){//当前状态是想取消状态
               AudioManager.cancel();
            }
            if(STATE_RECORDING = curState){
                if(tooShort){//判断录制时长,如果录制时间过短
                    DialogManager.showDialog(TOO_SHORT);
                }
               AudioManager.release();
               callbackActivity(url,time);//(当前录音文件路径,时长)
            }
    }

}

二、MediaManager封装

简述:使用MediaPlayer播放录制好的音频文件,要注意MediaPlayer资源的释放。更多关于MediaPlayer的知识参考【MediaPlayer】的使用。点击此处跳转

代码:

import android.media.*;

import java.io.IOException;


/**
 * 播放管理类
 */
public class MediaManager {

    private static MediaPlayer mMediaPlayer;

    private static boolean isPause;

    public static void playSound(String filePath, MediaPlayer.OnCompletionListener onCompletionListener) {

        if (mMediaPlayer == null) {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    mMediaPlayer.reset();
                    return false;
                }
            });
        } else {
            mMediaPlayer.reset();
        }
        try {
            mMediaPlayer.setAudioStreamType(android.media.AudioManager.STREAM_MUSIC);
            mMediaPlayer.setOnCompletionListener(onCompletionListener);
            mMediaPlayer.setDataSource(filePath);
            mMediaPlayer.prepare();
            mMediaPlayer.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void pause(){
        if(mMediaPlayer != null && mMediaPlayer.isPlaying()){
            mMediaPlayer.pause();
            isPause = true;
        }
    }

    public static void resume(){
        if(mMediaPlayer != null && isPause){
            mMediaPlayer.start();
            isPause = false;
        }
    }

    public static void release(){
        if(mMediaPlayer != null){
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }
}

三、DialogManager封装

封装了6个方法:

1. showRecordingDialog():用来设置Diaog布局,拿到控件的引用,显示Dialog。
2. recording():更改Dialog状态为录音中状态。
3. wantToCancel():更改Dialog状态为想要取消状态。
4. tooShort():更改Dialog状态为录音时长过短状态。
5. dismissDialog():移除Dialog。
6. updateVoiceLevel():用来更新音量图片。

代码:

import android.app.Dialog;
import android.content.Context;
import android.v
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值