Windows开发React Native安卓应用:@react-native-voice调用失败求助
解决@react-native-voice调用startSpeech等方法提示undefined问题
1. 确认包的正确导入与初始化
不管是原生RN还是Expo项目,必须确保模块初始化完成后再调用方法,避免因原生模块未加载导致的undefined错误:
import Voice from '@react-native-voice/voice'; import { useEffect, useState } from 'react'; import { Button, Text } from 'react-native'; const SpeechRecorder = () => { const [transcript, setTranscript] = useState(''); useEffect(() => { // 组件挂载后注册监听事件 Voice.onSpeechResults = (event) => { setTranscript(event.value[0]); }; // 组件卸载时清理资源 return () => { Voice.destroy().catch(console.error); }; }, []); const startRecording = async () => { try { await Voice.start('zh-CN'); // 指定对应语言代码 } catch (err) { console.error('启动录音失败:', err); } }; const stopRecording = async () => { try { await Voice.stop(); } catch (err) { console.error('停止录音失败:', err); } }; return ( <> <Button title="开始录音" onPress={startRecording} /> <Button title="停止录音" onPress={stopRecording} /> <Text>识别结果:{transcript}</Text> </> ); }; export default SpeechRecorder;
2. 原生RN项目(npx react-native init创建)配置检查
Windows开发安卓需确保安卓端配置完整:
- 打开
android/app/src/main/AndroidManifest.xml,添加必要权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET" /> <!-- 部分语音识别需联网支持 -->
- 执行
npx react-native link @react-native-voice/voice确保模块链接完成(RN 0.60+自动链接,但手动执行可避免异常) - 清理安卓构建缓存:删除
android/build、android/app/build文件夹,进入android目录执行./gradlew clean,再重新打包安装
3. Expo项目(expo-cli创建)配置修正
针对SDK>41版本,需完成以下步骤:
- 确保
app.json中插件与权限配置正确:
{ "expo": { "plugins": [ [ "@react-native-voice/voice", { "microphonePermission": "语音转文字需要访问麦克风", "speechRecognitionPermission": "需要使用系统语音识别服务" } ] ], "android": { "permissions": ["RECORD_AUDIO"] } } }
- 运行
expo prebuild生成原生配置文件(Expo插件需预构建生效,无法直接使用Expo Go预览) - 执行
expo run:android构建自定义开发客户端,在实体机安装生成的APK后测试
4. 运行时权限检查
必须确保应用已获取麦克风权限,否则会导致调用失败:
import { PermissionsAndroid } from 'react-native'; const requestMicPermission = async () => { const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.RECORD_AUDIO, { title: "麦克风权限申请", message: "语音转文字功能需要使用您的麦克风", buttonPositive: "允许" } ); return granted === PermissionsAndroid.RESULTS.GRANTED; }; // 在启动录音前调用权限检查 const startRecording = async () => { const hasPermission = await requestMicPermission(); if (!hasPermission) { alert('请允许麦克风权限后再尝试'); return; } try { await Voice.start('zh-CN'); } catch (err) { console.error(err); } };
5. 版本兼容性验证
确认@react-native-voice/voice版本与RN/Expo SDK版本匹配:
- Expo SDK 49+建议使用3.2.4及以上版本的@react-native-voice/voice
- 原生RN 0.70+需对应兼容的包版本,可查看包的README文档确认适配范围
内容的提问来源于stack exchange,提问作者Aqib Naeem
相关产品推荐
相关产品推荐

