开发基于React Native Vision Camera的Expo模块遇崩溃问题求助
Expo模块集成Vision Camera帧处理器崩溃问题
我要开发一个Expo模块,实现自定义的React Native Vision Camera帧处理功能,类似现有插件的作用,但目前相关插件都不是用Expo模块开发的,也没有参考文档。
当我在模块里声明接收Vision Camera帧的函数时,应用会无提示崩溃,我推测是帧处理器插件注册有问题,但解决不了。
当前代码
MlkitTextRecognitionModule
class MlkitTextRecognitionModule : Module() { companion object { init { FrameProcessorPluginRegistry.addFrameProcessorPlugin("recognizeTextFromFrame") { proxy, options -> MlkitTextRecognitionFrameProcessor(proxy, options) } } } override fun definition() = ModuleDefinition { Name("MlkitTextRecognition") Constants( "PI" to Math.PI ) Events("onChange") Function("recognizeTextFromUri") { uri: String -> val file = File(uri) if (!file.exists()) { throw Exception("File not found at: $uri") } val bitmap = BitmapFactory.decodeFile(file.absolutePath) val inputImage = InputImage.fromBitmap(bitmap, 0) val recognizer = TextRecognition.getClient(JapaneseTextRecognizerOptions.Builder().build()) val visionText = try { Tasks.await(recognizer.process(inputImage)) } catch (e: Exception) { throw Exception("Text recognition failed: ${e.message}") } visionText.text } // 取消注释这段就会崩溃 // Function("recognizeTextFromFrame") { frame: Frame -> // // } }
MlkitTextRecognitionFrameProcessor
class MlkitTextRecognitionFrameProcessor(proxy: VisionCameraProxy, options: Map<String, Any>?): FrameProcessorPlugin() { override fun callback(frame: Frame, arguments: Map<String, Any>?): Any? { return "hello" } }
问题原因与解决办法
- 重复绑定冲突
你犯了核心错误:既通过FrameProcessorPluginRegistry注册了帧处理器插件,又试图在Expo模块的ModuleDefinition里用Function声明同名的recognizeTextFromFrame函数。这会导致Native层和JS层的绑定逻辑冲突,直接触发无提示崩溃。
Vision Camera的帧处理器插件机制已经完成了JS与Native的绑定,不需要再在Expo模块里额外声明同名函数。
- 修正步骤
- 直接删除
ModuleDefinition中那段注释的Function("recognizeTextFromFrame")代码块,保留FrameProcessorPluginRegistry的注册逻辑即可。 - 确保项目中正确引入了Vision Camera的Native依赖,编译时没有缺失
VisionCameraProxy、Frame等核心类。 - JS层调用示例:
import { useFrameProcessor } from 'react-native-vision-camera'; import { recognizeTextFromFrame } from './your-expo-module'; const frameProcessor = useFrameProcessor((frame) => { const result = recognizeTextFromFrame(frame); console.log('识别结果:', result); }, []);
- 额外注意事项
- 帧处理器的
callback方法运行在Vision Camera的专用帧处理线程,不要在这里执行同步的耗时操作(比如ML Kit的文本识别),建议把识别逻辑放到后台线程执行,避免阻塞帧流导致应用卡顿或崩溃。 - 测试时可以先让
callback返回简单字符串验证功能正常,再逐步集成ML Kit的识别逻辑。
内容的提问来源于stack exchange,提问作者Kagos
相关产品推荐
相关产品推荐

