React Native安卓语音助手开发报错:build.gradle与录音功能异常
React Native安卓语音助手@react-native-community/voice库编译及麦克风功能问题解决
一、编译错误:找不到compile()方法
问题原因
@react-native-community/voice库的Android build.gradle使用了Gradle已废弃的compile依赖配置关键字,Android Gradle Plugin 3.0+版本已改用implementation和testImplementation替代。
解决方案
- 修改库的build.gradle文件:
打开E:\react_native_projects\VoxAI\node_modules\react-native-voice\android\build.gradle,替换dependencies块中的compile和testCompile:dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) testImplementation 'junit:junit:4.12' implementation 'com.android.support:appcompat-v7:${supportVersion}' implementation 'com.facebook.react:react-native:+' } - 更新Gradle构建工具版本:
修改buildscript中的classpath为适配项目的新版本,同时补充google仓库:buildscript { repositories { jcenter() google() } dependencies { classpath 'com.android.tools.build:gradle:4.2.2' } } - 持久化修改(可选):
直接修改node_modules文件会在重新install后丢失,使用patch-package生成补丁:- 安装依赖:
npm install patch-package --save-dev - 修改文件后执行:
npx patch-package react-native-voice - 后续install会自动应用补丁
- 安装依赖:
二、麦克风功能调用错误
问题分析
代码中存在方法调用错误、权限缺失、事件监听兼容性问题三个核心问题。
解决方案
- 修复stopRecording方法调用:
修改HomeScreen.js中stopRecording函数的错误调用:const stopRecording = async()=>{ try{ await Voice.stop(); // 替换原未定义的stop()为Voice.stop() setRecording(false); }catch(error){ console.log('error in stop recoring',error); } } - 添加Android权限:
打开android/app/src/main/AndroidManifest.xml,添加麦克风和联网权限:<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET" /> - 优化事件监听逻辑:
替换useEffect中的直接赋值为addListener,避免事件丢失:useEffect(()=>{ const listeners = [ Voice.onSpeechStart(speechStartHandler), Voice.onSpeechEnd(speechEndHandler), Voice.onSpeechResults(speechResultsHandler), Voice.onSpeechError(speechErrorHandler), ]; return()=>{ Voice.destroy().then(() => { listeners.forEach(listener => listener.remove()); Voice.removeAllListeners(); }); } },[]) - 增加可用性检查:
在启动录音前先验证语音识别是否可用:const startRecording = async()=>{ setRecording(true); try{ const isAvailable = await Voice.isAvailable(); if(isAvailable !== 1){ throw new Error('语音识别不可用'); } await Voice.start('en-GB'); }catch(error){ setRecording(false); console.log('error in startRecording' ,error); } }
内容的提问来源于stack exchange,提问作者Chethanasree R
相关产品推荐
相关产品推荐

