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

时间:2018-11-17 17:24:01

标签: nativescript nativescript-angular

我正在尝试使用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 :(得分:0)

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

使用Array.create方法进行类型转换,有关更多详细信息,请参考docs here