Java 麦克风录音问题-(android)

Java 麦克风录音问题-(android),java,android,Java,Android,我有一小段代码,可以从麦克风读取一些声音,并编写一个字节数组。不幸的是,它不能正常工作。该项目在模拟器上运行,但写入字节数组时出错 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.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.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

        Button start_button;
        Button stop_button;
        TextView text;
        boolean reading = false;
        final String TAG = "TAG";
        int myBufferSize = 8192;
        AudioRecord audioRecord;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                start_button = (Button) findViewById(R.id.button1);
                stop_button = (Button) findViewById(R.id.button2);
                text = (TextView) findViewById(R.id.textView1);
                start_button.setOnClickListener(this);
                stop_button.setOnClickListener(this);
                createAudioRecorder();
        }

        private void createAudioRecorder() {
                int sampleRate = 16000;
                int channelConfig = AudioFormat.CHANNEL_IN_MONO;
                int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

                int minInternalBufferSize = AudioRecord.getMinBufferSize(sampleRate,
                                channelConfig, audioFormat);
                int internalBufferSize = minInternalBufferSize * 4;
                Log.d(TAG, "minInternalBufferSize = " + minInternalBufferSize
                                + ", internalBufferSize = " + internalBufferSize
                                + ", myBufferSize = " + myBufferSize);

                audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                                sampleRate, channelConfig, audioFormat, internalBufferSize);
        }

        @Override
        public void onClick(View v) {
                switch (v.getId()) {
                case R.id.button1:
                        Log.d(TAG, "record start");
                        reading = true;
                        startRecorder();
                case R.id.button2:
                        Log.d(TAG, "stop recorder");
                        reading = false;
                        stopRecorder();
                }
        }

        private void startRecorder() {
                reading = true;
                Log.d(TAG, "recording...");
                audioRecord.startRecording();

                new Thread(new Runnable() {
                        @Override
                        public void run() {
                                if (audioRecord == null)
                                        return;

                                byte[] myBuffer = new byte[myBufferSize];
                                byte[] data = new byte[myBufferSize];
                                int readCount = 0;
                                int totalCount = 0;
                                while (reading) {
                                        readCount = audioRecord.read(myBuffer, 0, myBufferSize);
                                        data = myBuffer;
                                        totalCount += readCount;
                                        Log.d(TAG, "readCount = " + readCount + ", totalCount = "
                                                        + totalCount);
                                        Log.d(TAG, "lenght: " + data.length);
                                        Log.d(TAG, "data1: " + data[0]);
                                        Log.d(TAG, "data2: " + data[1]);
                                }
                        }
                }).start();
        }

        private void stopRecorder() {
                reading = false;
                Log.d(TAG, "record stop!");
                audioRecord.stop();
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }

        @Override
        protected void onDestroy() {
                super.onDestroy();
                reading = false;
                if (audioRecord != null) {
                        audioRecord.release();
                }
        }

}
日志:

注意?为停止记录而写入的字节数组


为什么要两次“停止录音”?虽然我单击了一次停止按钮,但是为什么不使用FileOutputStream呢

要开始记录,请执行以下操作:

   FileOutputStream fos = openFileOutput(__FILENAME__,Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE);
            recorder = new MediaRecorder();
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            recorder.setOutputFile(fos.getFD());    
        recorder.prepare();
        recorder.start();

不要忘记停止并释放MediaRecorder。

以正常方式显示自己。Takendarkless,Takendarkless请解释到底是什么不起作用,如果出现异常,请发布您的logcat输出。我不需要文件,我需要一个字节数组
   FileOutputStream fos = openFileOutput(__FILENAME__,Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE);
            recorder = new MediaRecorder();
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            recorder.setOutputFile(fos.getFD());    
        recorder.prepare();
        recorder.start();