问题描述
我正在尝试使用react-native-live-audio-stream库。但是,在麦克风的许可下,我出现了错误。
我正在关注this exact link的设置方法。
这是我的录音机组件:
import React from 'react';
import {TouchableOpacity,View} from 'react-native';
import LiveAudioStream from 'react-native-live-audio-stream';
export default function Recorder() {
const options = {
sampleRate: 32000,// default is 44100 but 32000 is adequate for accurate voice recognition
channels: 1,// 1 or 2,default 1
bitsPerSample: 16,// 8 or 16,default 16
audioSource: 6,// android only (see below)
};
LiveAudioStream.init(options);
LiveAudioStream.on('data',(data) => {
// base64-encoded audio data chunks
});
return (
<View>
<TouchableOpacity onClick={LiveAudioStream.start()}>
<Text>Start recording!</Text>
</TouchableOpacity>
</View>
);
}
我得到的错误是:
startRecording() called on an uninitialized AudioRecord.
所以我开始研究许可问题……这是我到目前为止所得到的:
<uses-permission android:name="android.permission.RECORD_AUdio" />
<uses-permission android:name="Manifest.permission.RECORD_AUdio"/>
在AndroidManifest.xml中
通过添加对麦克风的请求,如下所示:
const requestMicrophone = async () =>{
if (ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.RECORD_AUdio) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.RECORD_AUdio},REQUEST_MICROPHONE);
}
我收到以下错误:
[![ActivityCompat.requestPermissions(getActivity(),new String\[\]{Manifest.permission.RECORD_AUdio},
关于如何解决此问题的任何想法?
编辑: 我已修正错误!记录器中与音频有关的事物需要放入一个功能,该功能通过开始记录来调用。
解决方法
尝试以下代码以在android中获得许可:
import {PermissionsAndroid,Platform} from 'react-native';
.....
const requestMicrophone = async () => { //replace your function with this code.
if (Platform.OS === 'android') {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,{
title: 'Permissions for record audio',message: 'Give permission to your device to record audio',buttonPositive: 'ok',},);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
console.log('permission granted');
} else {
console.log('permission denied');
return;
}
} catch (err) {
console.warn(err);
return;
}
}
}
,
首先,您使用的是onClick event
,它的react事件不是本机的反应,应该切换到onPress event
,并且每次使用LiveAudioStream.start()
来调用start()
的每个渲染
<View>
<TouchableOpacity onClick={LiveAudioStream.start()}>
<Text>Start recording!</Text>
</TouchableOpacity>
</View>
//edited
<View>
<TouchableOpacity onPress={()=>LiveAudioStream.start}>
<Text>Start recording!</Text>
</TouchableOpacity>
</View>```