当前位置: 首页 > 知识库问答 >
问题:

如何一次扫描一个条形码?“React-Native-Camera”

段干茂实
2023-03-14

实际上,我是一个新的反应,我正在尝试做一个简单的条形码扫描器,显示扫描条形码在一个警报和按“确定”后,在警报,用户应该可以扫描另一个条形码。

  onBarCodeRead = (e) => {
    if(!this.alertPresent){
      this.alertPresent = true;
          Alert.alert(
            "Barcode type is " + e.type,
            "Barcode value is " + e.data,
            [
                 {text: 'OK', onPress: () => this.alertPresent = false;},
            ],
              {cancelable: false},
          );
      }
  }
import React, { Component } from 'react';
import { Button, Text, View,Alert } from 'react-native';
import { RNCamera } from 'react-native-camera';
import BarcodeMask from 'react-native-barcode-mask';
class ProductScanRNCamera extends Component {

  constructor(props) {
    super(props);
    this.camera = null;
    this.barcodeCodes = [];
    this.alertPresent = false;
    this.state = {
      camera: {
        flashMode: RNCamera.Constants.FlashMode.auto,
      }
    };
  }

  onBarCodeRead = (e) => {
    if(!this.alertPresent){
      this.alertPresent = true;
          Alert.alert(
            "Barcode type is " + e.type,
            "Barcode value is " + e.data,
            [
                 {text: 'OK', onPress: () => this.alertPresent = false;},
            ],
              {cancelable: false},
          );
      }
  }


  pendingView() {
    return (
      <View
      style={{
        flex: 1,
        backgroundColor: 'lightgreen',
        justifyContent: 'center',
        alignItems: 'center',
      }}
      >
      <Text>Waiting</Text>
      </View>
    );
  }

  render() {


    return (
      <View style={styles.container}>
      <RNCamera
      ref={ref => {
        this.camera = ref;
      }}
      defaultTouchToFocus
      flashMode={this.state.camera.flashMode}
      mirrorImage={false}
      onBarCodeRead={this.onBarCodeRead.bind(this)}
      onFocusChanged={() => {}}
      onZoomChanged={() => {}}
      style={styles.preview}
      >
      <BarcodeMask/>
      </RNCamera>
      </View>
    );
  }
}

共有1个答案

季阳朔
2023-03-14

这里的诀窍是用内部状态修改barcodeTypes道具。

const defaultBarcodeTypes = [// should be all Types from RNCamera.Constants.BarCodeType];

class ProductScanRNCamera extends Component {
   state = {
      // your other states
      barcodeType: '',
      barcodeValue: '',
      isBarcodeRead: false // default to false
   }

   onBarcodeRead(event) {
      this.setState({isBarcodeRead: true, barcodeType: event.type, barcodeValue: event.data});
   }

   // run CDU life-cycle hook and check isBarcodeRead state
   // Alert is a side-effect and should be handled as such.
   componentDidUpdate() {
      const {isBarcodeRead, barcodeType, barcodeValue} = this.state;
      if (isBarcodeRead) {
         Alert.alert(barcodeType, barcodeValue, [
           { 
               text: 'OK', 
               onPress: () => {
                   // Reset everything 
                   this.setState({isBarcodeRead: false, barcodeType: '', barcodeValue: ''})
               }
           }
         ]);
      }

   }

   render() {
      const {isBarcodeRead} = this.state;
      return (
         <RNCamera {...your other props} barcodeTypes={isBarcodeRead ? [] : defaultBarcodeTypes}>
            <BarcodeMask />
         </RNCamera>
      )

   }
}

钩子版本更干净

const ProductScanRNCamera = () => {
   const [isBarcodeRead, setIsBarcodeRead] = useState(false);
   const [barcodeType, setBarcodeType] = useState('');
   const [barcodeValue, setBarcodeValue] = useState('');

   useEffect(() => {
      if (isBarcodeRead) {
          Alert.alert(
             barcodeType, 
             barcodeValue, 
             [
                {
                    text: 'OK',
                    onPress: () => {
                        // reset everything
                        setIsBarcodeRead(false);
                        setBarcodeType('');
                        setBarcodeValue('');
                    }
                }
             ]
          );
      }

   }, [isBarcodeRead, barcodeType, barcodeValue]);

   const onBarcodeRead = event => {
      if (!isBarcodeRead) {
         setIsBarcodeRead(true);
         setBarcodeType(event.type);
         setBarcodeValue(event.data);
      }
   }

   return (
      <RNCamera {...your props} 
                onBarCodeRead={onBarcodeRead} 
                barcodeTypes={isBarcodeRead ? [] : defaultBarcodeTypes}>
         <BarcodeMask />
      </RNCamera>
   )
}
 类似资料:
  • 我正在使用react native camera为Android和iOS构建条形码扫描仪。 我可以在iOS中扫描条形码,但问题是扫描边界没有视觉效果。我希望整个屏幕能够扫描条形码,而不仅仅是屏幕中间。 有什么办法吗?如果有其他图书馆也适合我。

  • 我有一个Rails应用程序,通过制造过程跟踪我们的产品。我想有一个条形码扫描器在每个工作站和有员工扫描条形码为一个项目时,他已完成的工作为该项目。 有没有可能识别出10台条形码扫描仪中使用了哪一台? 我知道一些扫描仪能够在扫描的条形码之前输入前缀,所以我可以解析该前缀来识别所使用的扫描仪。我希望有另一种解决办法。

  • 使用ML Kit的条码扫描API,您可以读取大多数使用标准条码格式编码的数据。 条形码是将信息从现实世界传递到应用程序的一种便捷方式。特别是,使用QR码等二维格式时,您可以编码结构化数据,如联系人信息或WiFi网络凭证。由于ML Kit可以自动识别和解析这些数据,因此当用户扫描条形码时,您的应用可以进行智能响应。 iOS Android 关键功能 阅读大多数标准格式 线性格式:Codabar,Co

  • 我正在使用camerax和google mlkit条形码扫描库来制作一个条形码阅读器。而app扫描qrcode工作良好,但代码格式为条形码,结果会有所不同。条形码有时会扫描多次,例如,有树条形码,但扫描器得到的结果是四个或五个。任何人都知道这个问题,任何帮助都是感激的。图1图2

  • 我想用react native扫描GS1 Databar条码,在IOS中也称为RSS扩展条码,我正在使用react native qrcode扫描仪https://github.com/moaazsidat/react-native-qrcode-scanner扫描条形码。 它在android中工作正常,但在IOS中无法选择条形码。在IOS QR Code中,正在成功扫描EAN-8条形码,但未扫描

  • 问题内容: 如何简单地在iPhone和/或iPad上扫描条形码? 问题答案: 我们为iPhone生产了“条形码”应用程序。它可以解码QR码。源代码可从zxing项目获得;具体来说,您想看看iPhone客户端和核心库的部分C ++端口 。该端口从Java代码的0.9发行版开始有点过时了,但仍然可以正常使用。 如果您需要扫描其他格式(例如1D格式),则可以继续将该项目中的Java代码移植到C ++。