mirror of
https://github.com/zhigang1992/examples.git
synced 2026-01-12 22:47:03 +08:00
92 lines
2.0 KiB
JavaScript
92 lines
2.0 KiB
JavaScript
import * as ImagePicker from 'expo-image-picker';
|
|
import React from 'react';
|
|
import { Button, Image, StyleSheet, Text, View } from 'react-native';
|
|
|
|
const API_KEY = '<YOUR_API_KEY_HERE>';
|
|
const API_URL = `https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}`
|
|
|
|
async function callGoogleVisionAsync(image) {
|
|
const body = {
|
|
requests: [
|
|
{
|
|
image: {
|
|
content: image,
|
|
},
|
|
features: [
|
|
{
|
|
type: 'LABEL_DETECTION',
|
|
maxResults: 1,
|
|
}
|
|
]
|
|
},
|
|
],
|
|
};
|
|
|
|
const response = await fetch(API_URL, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Accept': 'application/json',
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(body),
|
|
});
|
|
const parsed = await response.json();
|
|
|
|
console.log('Result:', parsed);
|
|
|
|
return parsed.responses[0].labelAnnotations[0].description;
|
|
}
|
|
|
|
export default function App() {
|
|
const [image, setImage] = React.useState(null);
|
|
const [status, setStatus] = React.useState(null);
|
|
|
|
const takePictureAsync = async () => {
|
|
const { cancelled, uri, base64 } = await ImagePicker.launchCameraAsync({
|
|
base64: true,
|
|
});
|
|
if (!cancelled) {
|
|
setImage(uri);
|
|
setStatus('Loading...');
|
|
try {
|
|
const result = await callGoogleVisionAsync(base64)
|
|
setStatus(result);
|
|
} catch (error) {
|
|
console.log(error);
|
|
setStatus(`Error: ${error.message}`);
|
|
}
|
|
} else {
|
|
setImage(null);
|
|
setStatus(null);
|
|
}
|
|
}
|
|
|
|
return (
|
|
<View style={styles.container}>
|
|
{image && <Image
|
|
style={styles.image}
|
|
source={{ uri: image }}
|
|
/>}
|
|
{status && <Text style={styles.text}>
|
|
{status}
|
|
</Text>}
|
|
<Button onPress={takePictureAsync} title="Take a Picture" />
|
|
</View>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
backgroundColor: 'white',
|
|
alignItems: 'center',
|
|
justifyContent: 'center',
|
|
},
|
|
image: {
|
|
width: 300,
|
|
height: 300,
|
|
},
|
|
text: {
|
|
margin: 5,
|
|
}
|
|
}); |