关于在Expo/React Native中调用设备原生相机应用的问题
关于在Expo/React Native中调用设备原生相机应用的问题
看起来你踩的这个坑我之前帮好几个开发者排查过!核心问题就是你代码里硬编码了一加的相机包名com.oplus.camera——这在Expo Go里能凑合用(刚好你测试机是一加),但打包成开发构建或者APK之后就不行了,原因有两个:一是其他品牌的手机根本没有这个包名的相机应用,二是安卓11及以上的包可见性政策会限制你访问未声明的第三方App,再加上Expo构建时的权限配置没跟上,自然就打不开了。
给你几个靠谱的解决办法:
- 别再硬编码特定厂商的包名了!用通用的方式唤起系统默认相机,比如用Expo官方的
expo-intent-launcher,它能自动适配所有安卓品牌的相机,代码示例如下:import { IntentLauncherAndroid } from 'expo-intent-launcher'; const openSystemCamera = async () => { try { // 发送拍照Intent,系统会唤起默认相机应用 await IntentLauncherAndroid.startActivityAsync( IntentLauncherAndroid.ACTION_IMAGE_CAPTURE ); } catch (error) { console.log('打开相机失败:', error); } }; - 补全权限配置:在你的
app.json里必须加上相机相关的权限声明,不然Expo构建时会把相机访问权限给屏蔽掉,示例配置:{ "expo": { "android": { "permissions": [ "CAMERA", "WRITE_EXTERNAL_STORAGE" ] } } } - 如果实在坚持要用
Linking的方式,那得在app.json里声明你要访问的相机包名(但还是不推荐,太局限),比如安卓11+需要配置包可见性:{ "expo": { "android": { "packageVisibility": [ "com.oplus.camera", // 还要加上其他你想适配的厂商相机包名,比如小米、三星的 "com.miui.camera", "com.sec.android.app.camera" ] } } }
总结下,最省心的就是用expo-intent-launcher的通用Intent方式,不用管各个厂商的包名,还能在Expo构建和APK里正常工作。
备注:内容来源于stack exchange,提问作者Vaibhav Srivastava
相关产品推荐
相关产品推荐

