From 0a8c904e1c2a22ca941b5512a47c157e8386bd8b Mon Sep 17 00:00:00 2001 From: Alan Hughes <30924086+alanjhughes@users.noreply.github.com> Date: Sat, 27 Apr 2024 10:28:58 +0100 Subject: [PATCH] [camera] Support scanning barcode from URL (#28445) --- .../ExpoComponentsStackNavigator.tsx | 6 ++ .../Camera/CameraScreenBarcodeFromURL.tsx | 64 +++++++++++ .../src/screens/ExpoComponentsScreen.tsx | 1 + packages/expo-camera/CHANGELOG.md | 2 + .../expo/modules/camera/CameraExceptions.kt | 3 + .../expo/modules/camera/CameraViewModule.kt | 30 ++++++ .../BarcodeScannerResultSerializer.kt | 48 +++++++++ .../camera/analyzers/MLKitBarcodeAnalyzer.kt | 102 ++++++++++++++++++ packages/expo-camera/build/index.d.ts | 14 +++ packages/expo-camera/build/index.d.ts.map | 2 +- packages/expo-camera/build/index.js | 15 +++ packages/expo-camera/build/index.js.map | 2 +- .../expo-camera/ios/CameraViewModule.swift | 31 ++++++ .../ios/Common/BarcodeExceptions.swift | 19 ++++ .../expo-camera/ios/Common/BarcodeUtils.swift | 70 ++++++++++++ .../ios/Common/ExpoCameraUtils.swift | 2 +- packages/expo-camera/src/index.ts | 19 ++++ 17 files changed, 427 insertions(+), 3 deletions(-) create mode 100644 apps/native-component-list/src/screens/Camera/CameraScreenBarcodeFromURL.tsx create mode 100644 packages/expo-camera/android/src/main/java/expo/modules/camera/analyzers/BarcodeScannerResultSerializer.kt create mode 100644 packages/expo-camera/android/src/main/java/expo/modules/camera/analyzers/MLKitBarcodeAnalyzer.kt create mode 100644 packages/expo-camera/ios/Common/BarcodeExceptions.swift create mode 100644 packages/expo-camera/ios/Common/BarcodeUtils.swift diff --git a/apps/native-component-list/src/navigation/ExpoComponentsStackNavigator.tsx b/apps/native-component-list/src/navigation/ExpoComponentsStackNavigator.tsx index ca85a970777c0..1099a903d24af 100644 --- a/apps/native-component-list/src/navigation/ExpoComponentsStackNavigator.tsx +++ b/apps/native-component-list/src/navigation/ExpoComponentsStackNavigator.tsx @@ -67,6 +67,12 @@ export const Screens = [ }, name: 'Camera (barcode)', }, + { + getComponent() { + return optionalRequire(() => require('../screens/Camera/CameraScreenBarcodeFromURL')); + }, + name: 'Camera (barcode from URL)', + }, { getComponent() { return optionalRequire(() => require('../screens/TextScreen')); diff --git a/apps/native-component-list/src/screens/Camera/CameraScreenBarcodeFromURL.tsx b/apps/native-component-list/src/screens/Camera/CameraScreenBarcodeFromURL.tsx new file mode 100644 index 0000000000000..d293a5b5f8e8b --- /dev/null +++ b/apps/native-component-list/src/screens/Camera/CameraScreenBarcodeFromURL.tsx @@ -0,0 +1,64 @@ +import { BarcodeScanningResult, Camera } from 'expo-camera'; +import { Image } from 'expo-image'; +import * as ImagePicker from 'expo-image-picker'; +import { useState } from 'react'; +import { View, Text, Button, ScrollView, StyleSheet } from 'react-native'; + +export default function CameraScreenFromURL() { + const [image, setImage] = useState(null); + const [results, setResults] = useState(null); + + const pickImage = async () => { + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ImagePicker.MediaTypeOptions.Images, + allowsEditing: false, + quality: 1, + }); + + if (!result.canceled) { + setImage(result.assets[0].uri); + } + }; + + const scanImage = async () => { + if (!image) { + return; + } + const results = await Camera.scanFromURLAsync(image); + setResults(results); + }; + + return ( + + {!image && Select an image from the photo library} +