Android提高第十篇之AudioRecord实现"助听器"
使用AudioRecord必须要申请许可,在AndroidManifest.xml里面添加这句:
?
testRecord.java的源码如下:
?
package com.testRecord;import android.app.Activity;import android.media.AudioFormat;import android.media.AudioManager;import android.media.AudioRecord;import android.media.AudioTrack;import android.media.MediaRecorder;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.SeekBar;import android.widget.Toast;public class testRecord extends Activity {/** Called when the activity is first created. */Button btnRecord, btnStop, btnExit;SeekBar skbVolume;//调节音量boolean isRecording = false;//是否录放的标记static final int frequency = 44100;static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;int recBufSize,playBufSize;AudioRecord audioRecord;AudioTrack audioTrack;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);setTitle("助听器");recBufSize = AudioRecord.getMinBufferSize(frequency,channelConfiguration, audioEncoding);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);//------------------------------------------btnRecord = (Button) this.findViewById(R.id.btnRecord);btnRecord.setOnClickListener(new ClickEvent());btnStop = (Button) this.findViewById(R.id.btnStop);btnStop.setOnClickListener(new ClickEvent());btnExit = (Button) this.findViewById(R.id.btnExit);btnExit.setOnClickListener(new ClickEvent());skbVolume=(SeekBar)this.findViewById(R.id.skbVolume);skbVolume.setMax(100);//音量调节的极限skbVolume.setProgress(70);//设置seekbar的位置值audioTrack.setStereoVolume(0.7f, 0.7f);//设置当前音量大小skbVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {float vol=(float)(seekBar.getProgress())/(float)(seekBar.getMax());audioTrack.setStereoVolume(vol, vol);//设置音量}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// TODO Auto-generated method stub}});}@Overrideprotected void onDestroy() {super.onDestroy();android.os.Process.killProcess(android.os.Process.myPid());}class ClickEvent implements View.OnClickListener {@Overridepublic void onClick(View v) {if (v == btnRecord) {isRecording = true;new RecordPlayThread().start();// 开一条线程边录边放} else if (v == btnStop) {isRecording = false;} else if (v == btnExit) {isRecording = false;testRecord.this.finish();}}}class RecordPlayThread extends Thread {public void run() {try {byte[] buffer = new byte[recBufSize];audioRecord.startRecording();//开始录制audioTrack.play();//开始播放while (isRecording) {//从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) {Toast.makeText(testRecord.this, t.getMessage(), 1000);}}};}?