You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:02:40