请帮忙看看这个程序哪里有问题,为什么在 run 里检查 dstat 的值始终是没有初始化?谢谢!
package com.AudioTest;import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class AudioTestActivity extends Activity {
private Button record;
private Button play;

AudioRecord audioRecord;

int recBufSize;
int frequency =8000;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; boolean isRecording = false;// 是否录放的标记
Thread recordThread=null;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        record = (Button) findViewById(R.id.record);   
        play = (Button) findViewById(R.id.play);   
        record.setOnClickListener(new OnClickListener() {   
               
            @Override  
            public void onClick(View v) {   
                   
                if(record.getTag()==null || !record.getTag().equals("ing"))
                {   
                    start();   
                }
                else
                {   
//                  stopAndSave();   
                }   
            }   
        }); 
    }    public void start()
    {
        Log.e("test", "test");
        
        recBufSize = AudioRecord.getMinBufferSize(frequency,
         channelConfiguration, audioEncoding);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
frequency, channelConfiguration, audioEncoding,
recBufSize);
isRecording = true;
recordThread = new AudioRecordThread();
recordThread.start();
    }
    
    class AudioRecordThread extends Thread
    {
public void run()
{
try
{
byte[] buffer = new byte[recBufSize];
int rstat=audioRecord.getRecordingState();
int dstat=audioRecord.getState();
if(dstat!=AudioRecord.STATE_INITIALIZED)
{
Log.e("test", "AudioRecord state is not successfully initialized. rstat="+rstat+"  dstat="+dstat);
return;
} audioRecord.startRecording();// 开始录制
while (isRecording)
{
int bufferReadResult = audioRecord.read(buffer, 0, 320);
Thread.sleep(1);
}
audioRecord.stop();
}
catch (Throwable t)
{
Log.w("test", "audio record stop");
}

finally
{
audioRecord.release();
audioRecord=null;
}
}
    }
}

解决方案 »

  1.   

    if(dstat!=AudioRecord.STATE_INITIALIZED)
    那这个dstat是什么状态?获取到值了吗?
      

  2.   

    仅供参考:package com.ppmeet.mic;import com.ryong21.encode.Encoder;import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.MediaRecorder;public class PcmRecorder implements Runnable { private volatile boolean isRecording;
    private final Object mutex = new Object();// 对象,用来设置线程上锁的锁定对象。
    private static final int frequency = 8000;// 采样率,单位围Hz
    // 该格式的音频数据为代表.音频数据格式:PCM 16位每个样本。保证是支持设备。
    private static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; public PcmRecorder() {
    super();
    } public void run() {
    Encoder encoder = new Encoder();
    Thread encodeThread = new Thread(encoder);
    encoder.setRecording(true);// 设置线程当前状态。
    encodeThread.start();// 开始编码
    synchronized (mutex) {// 对象上锁
    while (!this.isRecording) {
    try {
    mutex.wait();
    } catch (InterruptedException e) {
    throw new IllegalStateException("Wait() 打断了!", e);
    }
    }
    }
    // 设置线程的优先级,优先考虑最重要的音频线程。
    android.os.Process
    .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
    int bufferRead = 0;
    // 返回所需最低缓冲区大小的从成功建立AudioRecord对象。
    // 注意这个尺寸大小并不保证其顺利记录加载方式,
    // 和更高的价值应选用根据预期的频率的AudioRecord实例将调查为新数据。
    int bufferSize = AudioRecord.getMinBufferSize(frequency,
    AudioFormat.CHANNEL_IN_MONO, audioEncoding);
    // AudioFormat.CHANNEL_IN_MONO音频的配置
    short[] tempBuffer = new short[bufferSize];
    /*
     * 下面的bufferSize是 (字节单位)在写入录音的时候的音频的总缓冲区大小。
     */
    AudioRecord recordInstance = new AudioRecord(
    MediaRecorder.AudioSource.MIC, frequency,
    AudioFormat.CHANNEL_IN_MONO, audioEncoding, bufferSize);
    recordInstance.startRecording();// 开始录音
    while (this.isRecording) {
    // bufferRead = recordInstance.read(tempBuffer, 0, bufferSize);
    // 读取音频数据来自的音频硬件,记录到一个缓冲区。
    bufferRead = recordInstance.read(tempBuffer, 0, 640);// 录音数据被写入tempBuffer数组
    if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION) {
    throw new IllegalStateException(
    "read() returned AudioRecord.ERROR_INVALID_OPERATION");
    } else if (bufferRead == AudioRecord.ERROR_BAD_VALUE) {
    throw new IllegalStateException(
    "read() returned AudioRecord.ERROR_BAD_VALUE");
    } else if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION) {
    throw new IllegalStateException(
    "read() returned AudioRecord.ERROR_INVALID_OPERATION");
    }
    if (encoder.isIdle()) {// 如果编码过来了
    encoder.putData(System.currentTimeMillis(), tempBuffer,
    bufferRead);// 解码数据开始
    System.out.println(System.currentTimeMillis());
    } else {
    System.out.println("编码不过来,丢失数据!");
    }
    }
    recordInstance.stop();// 线程完了关闭录音
    encoder.setRecording(false);
    } // 设置线程状态
    public void setRecording(boolean isRecording) {
    synchronized (mutex) {
    this.isRecording = isRecording;
    if (this.isRecording) {
    mutex.notify();
    }
    }
    } public boolean isRecording() {
    synchronized (mutex) {
    return isRecording;
    }
    }
    }
      

  3.   

    peijiangping1989:不行啊。你的代码跟我其实是一样的。