Android Wear AudioRecord перестал работать?

У меня есть класс звукозаписи, который использует AudioRecord для записи звука и сохранения его в массиве байтов. Он работал нормально до недавнего времени, когда мой AudioRecord не инициализировался, и я не вижу, где я ошибаюсь.

Мой класс рекордера:

public class SoundRecorder {

    private static final int RECORDER_SAMPLERATE = 8000;
    private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
    private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
    private AudioRecord recorder = null;
    private Thread recordingThread = null;
    private boolean isRecording = false;
    private int bufferSize = 0;
    private ByteArrayOutputStream bOutputStream;

    int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024
    int BytesPerElement = 2; // 2 bytes in 16bit format

    SoundRecorder(){
        bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
                RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
        bOutputStream = null;
    }

    public void startRecording() {

        recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                RECORDER_SAMPLERATE, RECORDER_CHANNELS,
                RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement);


        if(recorder.getState() == AudioRecord.STATE_INITIALIZED){
            recorder.startRecording();
            isRecording = true;
            recordingThread = new Thread(new Runnable() {
                public void run() {
                    storeAudioData();
                }
            }, "AudioRecorder Thread");
            recordingThread.start();
        }else{
            // Audio recorder failed to initialise
        }

    }

    public byte[] stopRecording() {
        // stops the recording activity
        if (recorder != null) {
            isRecording = false;
            recorder.stop();
            recorder.release();
            recorder = null;
            recordingThread = null;
            byte[] audioBytes = bOutputStream.toByteArray();

            try {
                bOutputStream.reset();
                bOutputStream.close();
                Log.d("RECORDER", "bOutputstream closed");
            } catch (IOException e) {
                Log.d("RECORDER", "Output stream could not be closed or reset");
                e.printStackTrace();
            }
            if(audioBytes != null){
                return audioBytes;
            }else{
                return null;
            }
        } else {
            return null;
        }
    }

    private void storeAudioData() {
        // Store the audio in bytes

        short sData[] = new short[BufferElements2Rec];

        bOutputStream = new ByteArrayOutputStream();

        while (isRecording) {
            // Get the voice output from microphone and store in byte format in byte output stream
            recorder.read(sData, 0, BufferElements2Rec);
            try {
                // Converts short data to byte array
                // Stores in byte array output stream
                byte bData[] = short2byte(sData);
                bOutputStream.write(bData);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //convert short to byte
    private byte[] short2byte(short[] sData) {
        int shortArrsize = sData.length;
        byte[] bytes = new byte[shortArrsize * 2];
        for (int i = 0; i < shortArrsize; i++) {
            bytes[i * 2] = (byte) (sData[i] & 0x00FF);
            bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
            sData[i] = 0;
        }
        return bytes;
    }

    public boolean isRecording(){
        return isRecording;
    }
}

Может ли кто-нибудь помочь мне с этим? Спасибо.


person Highway62    schedule 17.03.2016    source источник


Ответы (1)


Я, наконец, решил эту проблему после того, как выдернул волосы. На Android Wear (moto360) на экране настроек есть пункт меню «Разрешения». Здесь я установил для своего приложения разрешение «микрофон> включен». Я понятия не имею, когда эта функция была добавлена, но она решила мою проблему.

person Highway62    schedule 18.03.2016