自定义录音工具类

录音管理类:AudioManger.java

负责创建录音文件,初始化录音,获取音量大小,开始录音,结束录音,释放资源等。

/**
 * Created by qianye on 2016/8/30.
 */
public class AudioManger {
    private MediaRecorder mMediaRecorder;
    private String mDir;
    private String mCurrentFilePath;

    private static AudioManger mInstance;

    private boolean isPrepared;

    //Recorder准备好录音后的回调
    public interface AudioStateListener {
        void wellPrepared();
    }

    public AudioStateListener mListener;

    public void setOnAudioStateListener(AudioStateListener Listener) {
        this.mListener = Listener;
    }


    //单例模式
    public static AudioManger getInstance(String dir) {
        if (mInstance == null) {
            synchronized (AudioManger.class) {
                if (mInstance == null) {
                    mInstance = new AudioManger(dir);
                }
            }
        }
        return mInstance;
    }

    //构造器 参数:  录音文件夹
    private AudioManger(String dir) {
        mDir = dir;
    }

    //准备录音
    public void prepareAudio() {
        try {
            isPrepared = false;
            //在录音目录下建立录音文件
            File dir = new File(mDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            String fileName = generateFileName();
            File file = new File(dir, fileName);
            mCurrentFilePath = file.getAbsolutePath();

            mMediaRecorder = new MediaRecorder();
            //设置输出文件
            mMediaRecorder.setOutputFile(mCurrentFilePath);
            //设置音频源为麦克风
            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            //设置音频格式api>=10使用amr_nb 小于10使用raw_amr
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
            //设置音频的编码为amr
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            //准备录制
            mMediaRecorder.prepare();

            //准备好录制
            isPrepared = true;
            if (mListener != null) {
                mListener.wellPrepared();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start() {
        if (isPrepared) {
            //开始录制
            mMediaRecorder.start();
        }
    }

    //随机生成文件名称
    private String generateFileName() {
        return System.currentTimeMillis() + ".amr";
    }

    //获取音量大小  maxLevel为最大等级
    public int getVoiceLevel(int maxLevel) {
        if (isPrepared) {
            try {
                //mMediaRecorder.getMaxAmplitude() 1-32767
                return maxLevel * mMediaRecorder.getMaxAmplitude() / 32768 + 1;
            } catch (Exception e) {

            }
        }
        return 1;
    }

    public void release() {
        if (mMediaRecorder != null) {
            mMediaRecorder.stop();
            mMediaRecorder.release();
            mMediaRecorder = null;
        }
    }

    public void cancel() {
        release();
        //如果取消就删除生成的录音文件
        if (mCurrentFilePath != null) {
            File file = new File(mCurrentFilePath);
            file.delete();
            mCurrentFilePath = null;
        }
    }

    public String getCurrentFilePath() {
        return mCurrentFilePath;
    }

}

自定义录音view:继承了ImageView
使用就和正常的ImageView一样
RecordView.java

/**
 * Created by qianye on 2017/4/6.
 */

public class RecordView extends ImageView implements AudioManger.AudioStateListener {

    private AudioManger audioManger;

    private boolean isRecording = false;//是否正在录制
    private boolean tooShort = false;//是否时间过短
    private int time = 0;
    private Handler handler;

    private int MaxVoice = 14;//默认音量等级

    private int MAXTIME = 90;

    private boolean isPrepared = false;

    public RecordView(Context context) {
        this(context, null);
        Log.i("LHD", "RecordView  1");
    }

    public RecordView(Context context, AttributeSet attrs) {
        super(context, attrs);
        Log.i("LHD", "RecordView  2");
        String dir = Environment.getExternalStorageDirectory() + "/audios";
        audioManger = AudioManger.getInstance(dir);
        audioManger.setOnAudioStateListener(this);
        handler = new Handler();
        audioManger.prepareAudio();

    }


    //audio准备后之后开始录音的回调
    @Override
    public void wellPrepared() {
        Log.i("LHD", "wellPrepared");
        isRecording = false;
        time = 0;
        tooShort = false;
        isPrepared = true;
    }

    public void start() {
        if (!isPrepared) {
            audioManger.prepareAudio();
        }
        audioManger.start();
        isRecording = true;
        //更新音量
        handler.post(runnable);
    }

    public void stop() {

        if (time <= 30) {
            audioRecordListener.tooShort();
        } else {
            //回调
            audioRecordListener.finish(time, audioManger.getCurrentFilePath());
        }
        //正常结束
        audioManger.release();
        isPrepared = false;
        reset();
    }

    //接口回调
    public interface AudioRecordListener {
        //已经录制的时间
        void hasRecord(int seconds);

        //录制完成
        void finish(int seconds, String filePath);

        //时间太短
        void tooShort();

        //音量大小  根据设置的最大音量返回当前音量值
        void curVoice(int voice);
    }

    private AudioRecordListener audioRecordListener;

    public void setOnAudioRecordListener(AudioRecordListener listener) {
        audioRecordListener = listener;
    }

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if (isRecording) {
                time++;
                audioRecordListener.hasRecord(time);
                audioRecordListener.curVoice(audioManger.getVoiceLevel(MaxVoice));
                handler.postDelayed(this, 100);
            }
        }
    };

    //置位
    private void reset() {
        isRecording = false;
        time = 0;
        tooShort = false;

        handler.removeCallbacks(runnable);
    }

    //get set 方法
    public void setMaxVoice(int maxVoice) {
        MaxVoice = maxVoice;
    }

    public int getMaxVoice() {
        return MaxVoice;
    }
}

使用:

        imgStart.setMaxVoice(16);
        imgStart.setOnAudioRecordListener(new RecordView.AudioRecordListener() {
            @Override
            public void hasRecord(int seconds) {
              //已经录制的时间
            }

            @Override
            public void finish(int seconds, String filePath) {

              //录制时间 注意此处单位是ms,如果需要修改成s可直接修改代码

            }

            @Override
            public void tooShort() {
                //小于3s显示时间过短
            }

            @Override
            public void curVoice(int voice) {
               //当前的音量等级
            }
        });

具体使用可参考我的另一篇博客:

自定义view实现录音功能,圆形进度条 - 秦时明月 - 博客频道 - CSDN.NET
http://blog.csdn.net/baidu_31093133/article/details/72768144

demo下载:

自定义view 录音 圆形进度条 - 下载频道 - CSDN.NET
http://download.csdn.net/detail/baidu_31093133/9853071

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值