【问题标题】:React Native, Expo 39: Scan barcodes using expo-camera in WebReact Native,Expo 39:在 Web 中使用 expo-camera 扫描条形码
【发布时间】:2020-11-12 02:38:51
【问题描述】:

最近,Expo 升级到了第 39 版,他们声称您现在可以使用 expo-camera 扫描浏览器中的条形码:https://dev.to/expo/expo-sdk-39-is-now-available-1lm8

它适用于 Android 和 iOS,但我仍然无法在浏览器中使用它(我知道我可以使用其他 Web 扫描库,但最好只使用一个库 expo-camera

有什么额外的配置吗?

我的package.json

...
dependencies: {
  ...,
  "expo": "~39.0.2",
  "react-native": "https://github.com/expo/react-native/archive/sdk-39.0.4.tar.gz",
  "react-native-web": "~0.13.12",
  "expo-camera": "~9.0.0",
  ...
}

MyCamera.tsx:

import React, { useEffect, useState } from 'react';
import { useIsFocused } from '@react-navigation/native';
import { Platform, StyleSheet, Text } from 'react-native';
import { BarCodeScanningResult, Camera } from 'expo-camera';

function PPCamera() {
  // properties
  const [hasPermission, setHasPermission] = useState(false);
  const [scanned, setScanned] = useState(false);
  const isFocused = useIsFocused();
  let camera: Camera | null;

  // methods
  useEffect(() => {
    (async () => {
      if (Platform.OS === 'web') {
        setHasPermission(true);
      } else {
        const { status } = await Camera.requestPermissionsAsync();
        console.log({ status });

        setHasPermission(status === 'granted');
      }
    })();
  }, []);

  const handleBarCodeScanned = (scanResult: BarCodeScanningResult) => {
    console.log({ scanResult });
    const { type, data } = scanResult;
    setScanned(true);
    alert(data);
    setTimeout(() => {
      setScanned(false);
    }, 1000);
  };

  // render
  if (hasPermission === null) {
    return <Text>Requesting for camera permission</Text>;
  }
  if (hasPermission === false) {
    return <Text>No access to camera</Text>;
  }
  return (
    isFocused && (
      <Camera
        ref={(ref) => {
          camera = ref;
        }}
        onBarCodeScanned={scanned ? undefined : handleBarCodeScanned}
        style={StyleSheet.absoluteFillObject}
      />
    )
  );
}

export default PPCamera;

const styles = StyleSheet.create({
  camera: {
    height: '80%',
    width: '100%',
    borderWidth: 2,
  },
});

该组件在 Web 上运行并且正在显示摄像头,但我没有收到任何 onBarCodeScanned 事件。我什至尝试过拍照,它适用于所有平台:let photo = await camera.takePictureAsync({ base64: true, quality: 0.5 });

谢谢!

【问题讨论】:

    标签: react-native expo react-native-web


    【解决方案1】:

    在托管应用中,相机需要

    Permissions.CAMERA

    在 App.json 文件中添加权限 链接-https://docs.expo.io/versions/v39.0.0/sdk/permissions/

    【讨论】:

    • 感谢您的回答。一切都适用于 Android 或 iOS,但仅适用于 Web 扫描停止工作(相机打开,但不扫描)。我的 app.json 中确实有相机权限。 NSCameraUsageDescription 用于 ios 和 "permissions": ["CAMERA"], 用于 android
    猜你喜欢
    • 2018-08-20
    • 2021-06-05
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多