Android可以通过MediaRecorder和AudioRecord这两个工具来实现录音,MediaRecorder直接把麦克风的数据存到文件,并且能够直接进行编码(如AMR,MP3等),而AudioRecord则是读取麦克风的音频流。本文使用AudioRecord读取音频流,使用AudioTrack播放音频流,通过“边读边播放”以及增大音量的方式来实现一个简单的助听器程序。
       PS:由于目前的Android模拟器还不支持AudioRecord,因此本程序需要编译之后放到真机运行。
       先贴出本文程序运行截图:

       PS:程序音量调节只是程序内部调节音量而已,要调到最大音量还需要手动设置系统音量。
       使用AudioRecord必须要申请许可,在AndroidManifest.xml里面添加这句:
       main.xml的源码如下:
XML/HTML代码
    - <linearlayout xmlns:android="http://schemas.android.com/apk/res/android"   
-         android:orientation="vertical" android:layout_width="fill_parent"  
-         android:layout_height="fill_parent">  
-   
-         <button android:layout_height="wrap_content" android:id="@+id/btnRecord"   
-                 android:layout_width="fill_parent" android:text="开始边录边放">  
-         <button android:layout_height="wrap_content"   
-                 android:layout_width="fill_parent" android:text="停止" android:id="@+id/btnStop">  
-         <button android:layout_height="wrap_content" android:id="@+id/btnExit"   
-                 android:layout_width="fill_parent" android:text="退出">  
-         <textview android:id="@+id/TextView01" android:layout_height="wrap_content"   
-                 android:text="程序音量调节" android:layout_width="fill_parent">  
-         <seekbar android:layout_height="wrap_content" android:id="@+id/skbVolume"   
-                 android:layout_width="fill_parent">  
       testRecord.java的源码如下:
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 {  
-           
-         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;  
-   
-         @Override  
-         public 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);  
-                 audioTrack.setStereoVolume(0.7f, 0.7f);  
-                 skbVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {  
-                           
-                         @Override  
-                         public void onStopTrackingTouch(SeekBar seekBar) {  
-                                 float vol=(float)(seekBar.getProgress())/(float)(seekBar.getMax());  
-                                 audioTrack.setStereoVolume(vol, vol);  
-                         }  
-                           
-                         @Override  
-                         public void onStartTrackingTouch(SeekBar seekBar) {  
-                                   
-                         }  
-                           
-                         @Override  
-                         public void onProgressChanged(SeekBar seekBar, int progress,  
-                                         boolean fromUser) {  
-                                   
-                         }  
-                 });  
-         }  
-   
-         @Override  
-         protected void onDestroy() {  
-                 super.onDestroy();  
-                 android.os.Process.killProcess(android.os.Process.myPid());  
-         }  
-   
-         class ClickEvent implements View.OnClickListener {  
-   
-                 @Override  
-                 public 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) {  
-                                           
-                                         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);  
-                         }  
-                 }  
-         };  
- }