其实在Android中录音可以用MediaRecord录音,操作比较简单。但是不能对音频进行处理。
考虑到项目中做的是实时语音只能选择AudioRecord进行录音。

public class AudioRecordManager {    public static final String TAG = "AudioRecordManager";    private AudioRecord mRecorder;    private DataOutputStream dos;    private Thread recordThread;    private boolean isStart = false;    private static AudioRecordManager mInstance;    private  int bufferSize;    public AudioRecordManager() {        bufferSize = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);        mRecorder = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize * 2);    }    /**     * 获取单例引用     *      * @return     */    public static AudioRecordManager getInstance() {        if (mInstance == null) {            synchronized (AudioRecordManager.class) {                if (mInstance == null) {                    mInstance = new AudioRecordManager();                }            }        }        return mInstance;    }    /**     * 销毁线程方法     */    private void destroyThread() {        try {            isStart = false;            if (null != recordThread && Thread.State.RUNNABLE == recordThread.getState()) {                try {                    Thread.sleep(500);                    recordThread.interrupt();                } catch (Exception e) {                    recordThread = null;                }            }            recordThread = null;        } catch (Exception e) {            e.printStackTrace();        } finally {            recordThread = null;        }    }    /**     * 启动录音线程     */    private void startThread() {        destroyThread();        isStart = true;        if (recordThread == null) {            recordThread = new Thread(recordRunnable);            recordThread.start();        }    }    /**     * 录音线程     */    Runnable recordRunnable = new Runnable() {        @Override        public void run() {            try {                android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);                int bytesRecord;                //int bufferSize = 320;                byte[] tempBuffer = new byte[bufferSize];                if (mRecorder.getState() != AudioRecord.STATE_INITIALIZED) {                    stopRecord();                    return;                }                mRecorder.startRecording();                //writeToFileHead();                while (isStart) {                    if (null != mRecorder) {                        bytesRecord = mRecorder.read(tempBuffer, 0, bufferSize);                        if (bytesRecord == AudioRecord.ERROR_INVALID_OPERATION || bytesRecord == AudioRecord.ERROR_BAD_VALUE) {                            continue;                        }                        if (bytesRecord != 0 && bytesRecord != -1) {                            //在此可以对录制音频的数据进行二次处理 比如变声,压缩,降噪,增益等操作                            //我们这里直接将pcm音频原数据写入文件 这里可以直接发送至服务器 对方采用AudioTrack进行播放原数据                            dos.write(tempBuffer, 0, bytesRecord);                        } else {                            break;                        }                    }                }            } catch (Exception e) {                e.printStackTrace();            }        }    };    /**     * 保存文件     *      * @param path     * @throws Exception     */    private void setPath(String path) throws Exception {        File file = new File(path);        if (file.exists()) {            file.delete();        }        file.createNewFile();        dos = new DataOutputStream(new FileOutputStream(file, true));    }    /**     * 启动录音     *      * @param path     */    public void startRecord(String path) {        try {            setPath(path);            startThread();        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 停止录音     */    public void stopRecord() {        try {        destroyThread();            if (mRecorder != null) {                if (mRecorder.getState() == AudioRecord.STATE_INITIALIZED) {                    mRecorder.stop();                }                if (mRecorder != null) {                    mRecorder.release();                }            }        if (dos != null) {            dos.flush();            dos.close();        }        } catch (Exception e) {            e.printStackTrace();        }    }}

使用前要添加如下权限:

更多相关文章

  1. android > Android实现计时与倒计时的几种方法
  2. 非UI线程可不可以更新UI(一)
  3. Android的权限分类
  4. Cocos2d-x权限问题
  5. android学习笔记----多线程断点续传下载原理设计
  6. Unity与Android权限设置
  7. Android线程之消息机制(Handler、MessageQueue、Looper、Thread)
  8. Android线程间通信的Message机制
  9. Android(安卓)ANR分析

随机推荐

  1. android 网络读取图片 带进度条
  2. Android代码实现APK文件的安装与卸载
  3. Android(安卓)Socket网络通信
  4. Android(安卓)RecyclerView横向滑动
  5. Android编译系统详解(一)
  6. Android中获取正在运行的应用程序-----Ac
  7. Android(安卓)分析ANR和死锁
  8. Eclipse 开发 Android, Hello, DatePicke
  9. android 获取和设置屏幕亮度
  10. Android(安卓)studio gradle 多渠道打包