这里直接使用的是android自身的东西,我只是拿来用的,大家要是有兴趣的话可以搜搜“Audio系统”,网上有好多文章都写的很好,可以参考,这里我写的是一个麦克风,我记得有个应用好像就是拿手机当麦克唱歌的,应用忘了叫什么了,现在我就实现一下麦克这个功能吧,废话不多说了,直接上代码。
这里我用线程来管理这个麦克,线程还用单例来实现,全局使用一个麦克,省得你弄很多个,弄出异常来不说,还弄出好几个声音来。
public class MicrophoneThread extends Thread {
// 麦克风的开关标记
private boolean isMicrophoneRecording = false;
// 需要用到的参数
static final int frequency = 44100;
// channelConfiguration = AudioFormat.CHANNEL_IN_MONO
static final int channelConfiguration = 0x00000002;
static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
// 定义录放音缓冲区大小
private int recBufSize, playBufSize;
// 实例化录音对象
private AudioRecord audioRecord;
// 实例化播放对象
private AudioTrack audioTrack;
// MicrophoneThread实例对象
private static MicrophoneThread microphoneThread = null;
private MicrophoneThread() {
// 调用getMinBufferSize方法获得录音的最小缓冲空间
recBufSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
// 调用getMinBufferSize方法获得放音最小的缓冲区大小
playBufSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
// 调用构造函数实例化录音对象
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, recBufSize);
// 调用构造函数实例化放音对象
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelConfiguration, audioEncoding, playBufSize, AudioTrack.MODE_STREAM);
}
public static MicrophoneThread getInstance() {
if (null == microphoneThread) {
microphoneThread = new MicrophoneThread();
}
return microphoneThread;
}
// 线程体实现麦克风的主要代码
public void run() {
try {
byte[] buffer = new byte[recBufSize];
audioRecord.startRecording();// 开始录制
audioTrack.play();// 开始播放
this.isMicrophoneRecording = true;
while (isMicrophoneRecording) {
// 从MIC保存数据到缓冲区
int bufferReadResult = audioRecord.read(buffer, 0, recBufSize);
byte[] tmpBuf = new byte[bufferReadResult];
System.arraycopy(buffer, 0, tmpBuf, 0, bufferReadResult);
// 写入数据就播放
audioTrack.write(tmpBuf, 0, tmpBuf.length);
}
audioTrack.stop();
audioRecord.stop();
} catch (Throwable t) {
}
}
// 停止麦克风的方法
public void stopMicrophone() {
this.isMicrophoneRecording = false;
MicrophoneThread.microphoneThread = null;
}
// 开启麦克风的方法,如果麦克已经开启则不处理
public void startMicrophone() {
if (!isMicrophoneRecording) {
this.start();
}
}
}
这样在每次使用之前先获取实例,建议使用自己的启动和停止麦克的方法来设置麦克风,最后的运行效果我就不上图了,其实也没有什么,两个按钮来控制开关,挺丑的,主代码也全在上边了,要是大家想支持我一下就下载一下文件,还是0分共享,谢谢!
发布了才想起来,还有很很重要的一个,要使用权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
OK,这次真心没有了