选择AudioRecord进行录后,实时播放也只能采用AudioTrack进行播放。

public class AudioTrackManager {    public static final String TAG = "AudioTrackManager";    private AudioTrack audioTrack;    private DataInputStream dis;    private Thread recordThread;    private boolean isStart = false;    private static AudioTrackManager mInstance;    private int bufferSize;    public AudioTrackManager() {        bufferSize = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize * 2, AudioTrack.MODE_STREAM);    }    /**     * 获取单例引用     *     * @return     */    public static AudioTrackManager getInstance() {        if (mInstance == null) {            synchronized (AudioTrackManager.class) {                if (mInstance == null) {                    mInstance = new AudioTrackManager();                }            }        }        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);                byte[] tempBuffer = new byte[bufferSize];                int readCount = 0;                while (dis.available() > 0) {                    readCount= dis.read(tempBuffer);                    if (readCount == AudioTrack.ERROR_INVALID_OPERATION || readCount == AudioTrack.ERROR_BAD_VALUE) {                        continue;                    }                    if (readCount != 0 && readCount != -1) {                        audioTrack.play();                        audioTrack.write(tempBuffer, 0, readCount);                    }                }              stopPlay();            } catch (Exception e) {                e.printStackTrace();            }        }    };    /**     * 播放文件     *     * @param path     * @throws Exception     */    private void setPath(String path) throws Exception {        File file = new File(path);        dis = new DataInputStream(new FileInputStream(file));    }    /**     * 启动播放     *     * @param path     */    public void startPlay(String path) {        try {            setPath(path);            startThread();        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 停止播放     */    public void stopPlay() {        try {            destroyThread();            if (audioTrack != null) {                if (audioTrack.getState() == AudioRecord.STATE_INITIALIZED) {                    audioTrack.stop();                }                if (audioTrack != null) {                    audioTrack.release();                }            }            if (dis != null) {                dis.close();            }        } catch (Exception e) {            e.printStackTrace();        }    }}

使用前要添加如下权限:

更多相关文章

  1. android 添加sensor 权限
  2. Android程序开发:简单电话拨号器
  3. 看完这篇,再也不怕被问到AsyncTask的原理
  4. 利用drozer进行Android渗透测试
  5. android那点事
  6. android通过耳机控制音乐播放器
  7. android 中的 Handler Thread Runnable 的理解
  8. Android录制或播放语音消息时关闭其他媒体播放
  9. android蓝牙开发————实现服务端客户端通信

随机推荐

  1. Android(安卓)TV开发(—)开始电视应用
  2. Android(安卓)studio 启动模拟器时解决 V
  3. Android(安卓)Http请求框架二:xUtils 框架
  4. 2011.07.05(4)——— android 抖动效果
  5. Android控件开发
  6. Android(安卓)P WindowManager (一) 直观
  7. android中build.gradle文件简单说明
  8. 使用BleLib的轻松搞定Android低功耗蓝牙B
  9. Android(安卓)Studio制作简易计算器源代
  10. Android(安卓)系统服务的两种注册方式