JS: java.lang.Exception: не удалось разрешить метод чтения на классе android.media.AudioRecord - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь использовать android.media.AudioRecord для сохранения звука, инициализация в порядке, startRecording() также вызывается без ошибок, но когда я начинаю читать аудио из буфера, я получаю ошибку Failed resolving method read on class android.media.AudioRecord.

Вот код:

const SAMPLE_RATE = 44100;
const RECORD_AUDIO = android.Manifest.permission.RECORD_AUDIO;
const AudioRecord = android.media.AudioRecord;
const AudioFormat = android.media.AudioFormat;
const MediaRecorder = android.media.MediaRecorder;

ngOnInit(): void {
    this.bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
    if (this.bufferSize == AudioRecord.ERROR || this.bufferSize == AudioRecord.ERROR_BAD_VALUE) {
        this.bufferSize = SAMPLE_RATE * 2;
    }
    this.bufferSize = this.bufferSize * 10;
    this.audioBuffer = new Array(this.bufferSize / 2);

    if (!permissions.hasPermission(RECORD_AUDIO)) {
        permissions.requestPermission(RECORD_AUDIO).then(() => {
            this.createRecorder();
        }, (err) => {
            console.log('[BrowseComponent] ngOnInit, ', 'permissions error:', err);
        });
    }
    else {
        this.createRecorder();
    }

}

createRecorder() {
    this.record = new AudioRecord.Builder()
        .setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION)
        .setAudioFormat(new AudioFormat.Builder()
            .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
            .setSampleRate(SAMPLE_RATE)
            .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
            .build())
        .setBufferSizeInBytes(this.bufferSize)
        .build();
    this.recordState = this.record && this.record.getState();
    if (this.recordState != AudioRecord.STATE_INITIALIZED) {
        console.error('[BrowseComponent] createRecorder, ', 'AudioRecord can\'t initialize, state:', this.recordState);
        return;
    }
    console.log('[BrowseComponent] createRecorder, ', 'AudioRecord:', this.record);
}

startRecord() {
    this.recording = true;
    this.record.startRecording();
    this.shortsRead = 0;
    while (this.recording) {
        const numberOfShort = this.record.read(this.audioBuffer, 0, this.bufferSize);
        this.shortsRead += numberOfShort;

        // Do something with the audioBuffer
    }
}

startRecord() вызывается из (tap) обработчика кнопки.Есть идеи, что может быть не так?

1 Ответ

0 голосов
/ 18 ноября 2018

Полагаю, проблема в том, что вы передаете JavaScript Array вместо Java Armitive (short) с типом Array, поэтому среда выполнения не может определить метод, который соответствует заданным параметрам.

Используйте метод Array.create для типизации, обратитесь к документам здесь для получения более подробной информации.

...