JS:java.lang.Exception:在 class android.media.AudioRecord 上读取的解析方法失败

JS: java.lang.Exception: Failed resolving method read on class android.media.AudioRecord

我正在尝试使用 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) 按钮处理程序调用。 有什么想法可能是错误的吗?

我想问题是您传递的是 JavaScript 数组而不是 Java 原始(短)类型数组,因此运行时无法识别与给定参数匹配的方法.

使用Array.create方法进行类型转换,详情请参考docs here