基于expo-image-picker,如何检测设备是否无相机以适配Zebra设备?
解决方案
托管工作流(Managed Workflow)下的实现
在Expo托管环境中,可通过结合相机权限请求与相机初始化检测,判断设备是否存在相机硬件:
import { Camera } from 'expo-camera'; import { useRef } from 'react'; async function checkCameraAvailability() { try { // 先请求相机权限 const { status } = await Camera.requestCameraPermissionsAsync(); if (status === 'granted') { // 获取可用相机类型,为空则说明无相机 const availableCameras = await Camera.getAvailableCameraTypesAsync(); return availableCameras.length > 0; } else { // 权限未授予时,尝试直接初始化相机(无相机设备会在此抛出错误) const cameraRef = useRef(null); try { await cameraRef.current?.initialize(); return true; } catch (error) { return false; } } } catch (error) { // 捕获到错误,说明设备无相机硬件 return false; } }
调用这个异步函数,根据返回的布尔值即可控制相机相关UI的显示与隐藏。
裸工作流(Bare Workflow)下的原生实现
如果项目是裸工作流,可直接调用原生平台API检测相机硬件:
Android 端
在自定义模块或Activity中添加检测逻辑:
import android.content.pm.PackageManager; public boolean isCameraAvailable() { return getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY); }
iOS 端
在自定义模块或ViewController中添加检测逻辑:
import AVFoundation func isCameraAvailable() -> Bool { let discoverySession = AVCaptureDevice.DiscoverySession( deviceTypes: [.builtInWideAngleCamera, .builtInTelephotoCamera, .builtInUltraWideCamera], mediaType: .video, position: .unspecified ) return !discoverySession.devices.isEmpty }
之后通过Expo原生模块桥接,将检测结果返回给JavaScript层即可。
内容的提问来源于stack exchange,提问作者Fiddle Freak
相关产品推荐
相关产品推荐

