无法在Android中使用AudioRecord录制

无法在Android中使用AudioRecord录制,android,audio-recording,audiorecord,Android,Audio Recording,Audiorecord,我正在开发一个Android应用程序。在我的应用程序中,我需要使用AudioRecord类录制音频。现在我正在创建一个简单的应用程序来测试AudioRecord类,因为我以前从未使用过它。我的简单应用是当用户点击“录制”按钮开始录制。单击“停止”时,停止录制。然后按“播放”按钮播放录制的音频。但我的应用程序在我点击“录制”按钮时出错 这是我的活动 public class MainActivity extends AppCompatActivity { Boolean recordin

我正在开发一个Android应用程序。在我的应用程序中,我需要使用AudioRecord类录制音频。现在我正在创建一个简单的应用程序来测试AudioRecord类,因为我以前从未使用过它。我的简单应用是当用户点击“录制”按钮开始录制。单击“停止”时,停止录制。然后按“播放”按钮播放录制的音频。但我的应用程序在我点击“录制”按钮时出错

这是我的活动

public class MainActivity extends AppCompatActivity {

    Boolean recording;


    private Button btnPlay,btnStop,btnRecord;
    private String outputFile = null;
    //outputFile = Environment.getExternalStorageDirectory().getAbsolutePath()+"/recording.3gp";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initialize();
        initViews();
        setUpViews();
    }

    private void initialize()
    {

    }

    private void initViews()
    {
        btnPlay = (Button)findViewById(R.id.btn_play);
        btnRecord = (Button)findViewById(R.id.btn_record);
        btnStop = (Button)findViewById(R.id.btn_stop);
    }

    private void setUpViews()
    {
        btnRecord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startRecord();
            }
        });

        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                recording = false;
                Toast.makeText(getBaseContext(),"Stopped",Toast.LENGTH_SHORT).show();
            }
        });

        btnPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                playRecord();
            }
        });
    }

    private void startRecord(){

        File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");

        try {
            file.createNewFile();

            OutputStream outputStream = new FileOutputStream(file);
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
            DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream);

            int minBufferSize = AudioRecord.getMinBufferSize(11025,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT);

            short[] audioData = new short[minBufferSize];

            AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                    11025,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    minBufferSize);

            audioRecord.startRecording();

            Toast.makeText(getBaseContext(),"Recording",Toast.LENGTH_SHORT).show();

            while(recording){
                int numberOfShort = audioRecord.read(audioData, 0, minBufferSize);
                for(int i = 0; i < numberOfShort; i++){
                    dataOutputStream.writeShort(audioData[i]);
                }
            }

            audioRecord.stop();
            dataOutputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void playRecord(){

        File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");

        int shortSizeInBytes = Short.SIZE/Byte.SIZE;

        int bufferSizeInBytes = (int)(file.length()/shortSizeInBytes);
        short[] audioData = new short[bufferSizeInBytes];

        try {
            InputStream inputStream = new FileInputStream(file);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);

            int i = 0;
            while(dataInputStream.available() > 0){
                audioData[i] = dataInputStream.readShort();
                i++;
            }

            dataInputStream.close();

            AudioTrack audioTrack = new AudioTrack(
                    AudioManager.STREAM_MUSIC,
                    11025,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    bufferSizeInBytes,
                    AudioTrack.MODE_STREAM);

            audioTrack.play();
            audioTrack.write(audioData, 0, bufferSizeInBytes);


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
public类MainActivity扩展了AppCompatActivity{
布尔记录;
专用按钮BTN显示、BTN停止、BTN记录;
私有字符串outputFile=null;
//outputFile=Environment.getExternalStorageDirectory().getAbsolutePath()+“/recording.3gp”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
初始化();
initViews();
setupview();
}
私有void初始化()
{
}
私有void initViews()
{
btnPlay=(按钮)findViewById(R.id.btn\U播放);
btnRecord=(按钮)findViewById(R.id.btn_记录);
btnStop=(按钮)findViewById(R.id.btn\u stop);
}
私有void setUpViews()
{
btnRecord.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
startRecord();
}
});
btnStop.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
记录=假;
Toast.makeText(getBaseContext(),“Stopped”,Toast.LENGTH_SHORT.show();
}
});
btnPlay.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
播放记录();
}
});
}
私有无效startRecord(){
File File=新文件(Environment.getExternalStorageDirectory(),“test.pcm”);
试一试{
createNewFile();
OutputStream OutputStream=新文件OutputStream(文件);
BufferedOutputStream BufferedOutputStream=新的BufferedOutputStream(outputStream);
DataOutputStream DataOutputStream=新的DataOutputStream(bufferedOutputStream);
int minBufferSize=AudioRecord.getMinBufferSize(11025,
AudioFormat.CHANNEL\u配置\u单声道,
音频格式。编码(PCM(16位);
short[]audioData=新的short[minBufferSize];
AudioRecord AudioRecord=新的录音(MediaRecorder.AudioSource.MIC,
11025,
AudioFormat.CHANNEL\u配置\u单声道,
AudioFormat.ENCODING_PCM_16位,
最小尺寸);
录音。开始录制();
Toast.makeText(getBaseContext(),“录制”,Toast.LENGTH_SHORT.show();
同时(录音){
int numberOfShort=audioRecord.read(audioData,0,minBufferSize);
for(int i=0;i0){
audioData[i]=dataInputStream.readShort();
i++;
}
dataInputStream.close();
AudioTrack=新的AudioTrack(
AudioManager.STREAM_音乐,
11025,
AudioFormat.CHANNEL\u配置\u单声道,
AudioFormat.ENCODING_PCM_16位,
bufferSizeInBytes,
音频跟踪模式(音频流);
音轨播放();
audioTrack.write(音频数据,0,缓冲大小为字节);
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
单击“录制”按钮时抛出错误

这是Logcat中的错误:


错误是什么?如何正确使用录音?

最后我解决了这个问题。我只需要运行新的线程进行录制

 private void startRecord(){

        File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");

        try {
            file.createNewFile();

            OutputStream outputStream = new FileOutputStream(file);
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
            dataOutputStream = new DataOutputStream(bufferedOutputStream);

            final int minBufferSize = AudioRecord.getMinBufferSize(11025,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT);

            audioData = new short[minBufferSize];

            final AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                    11025,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    minBufferSize);

            audioRecord.startRecording();

            Toast.makeText(getBaseContext(),"Recording",Toast.LENGTH_SHORT).show();


            recordingThread = new Thread(new Runnable() {
                public void run() {
                    while(recording){
                        int numberOfShort = audioRecord.read(audioData, 0, minBufferSize);
                        for(int i = 0; i < numberOfShort; i++){
                            try{
                                dataOutputStream.writeShort(audioData[i]);
                            }
                            catch (IOException e)
                            {
                                Toast.makeText(getBaseContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
                }
            }, "AudioRecorder Thread");

            audioRecord.stop();
            dataOutputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
private void startRecord(){
File File=新文件(Environment.getExternalStorageDirectory(),“test.pcm”);
试一试{
createNewFile();
OutputStream OutputStream=新文件OutputStream(文件);
BufferedOutputStream BufferedOutputStream=新的BufferedOutputStream(outputStream);
dataOutputStream=新的dataOutputStream(bufferedOutputStream);
final int minBufferSize=AudioRecord.getMinBufferSize(11025,
AudioFormat.CHANNEL\u配置\u单声道,
音频格式。编码(PCM(16位);
audioData=新的短[最小缓冲大小];
最终音频记录=新音频记录(MediaRecorder.AudioSource.MIC,
11025,
AudioFormat.CHANNEL\u配置\u单声道,
AudioFormat.ENCODING_PCM_16位,
最小尺寸);
录音。开始录制();
Toast.makeText(getBaseContext(),“录制”,Toast.LENGTH_SHORT.show();