之前做RN项目没调用过本地摄像头,今天下班早,做了一个简单的小demo:主要实现的功能:点击拍照按钮进入拍照界面,点击flip进行前后摄像头转换,点击开始拍照实现拍照功能(没写保存到本地的功能,大家可以自主开发),代码是参照expo官网的Camera写的一个小demo,大家可以结合的expo官网来看,该加注释的地方都在代码中加了,希望能对你有所帮助。
import React from ‘react‘ import { View, Text, TouchableOpacity, Button, Image } from ‘react-native‘ import { Camera, Permissions } from ‘expo‘; interface Props{ } //定义Camera的两个属性 interface State{ hasCameraPermission?:any, type?:any, isShowCamera: Boolean, uri:string } export default class componentName extends React.Component<Props,State> { public camera:any //定义一个camera来拿到Camera节点 constructor(props:Props) { super(props) this.state = { hasCameraPermission: null, //照相机权限 type: Camera.Constants.Type.back, //照相机类型 isShowCamera: false, //是否开启照相机 uri: ‘‘ } } async componentWillMount() { const { status } = await Permissions.askAsync(Permissions.CAMERA); this.setState({ hasCameraPermission: status === ‘granted‘ }); } //把官网里面的render粘过来 render() { const { hasCameraPermission } = this.state; if (hasCameraPermission === null) { return <View />; } else if (hasCameraPermission === false) { return <Text>没有权限打开照相机</Text>; } else { return ( <View style={{ flex: 1, paddingTop: 20 }}> { !this.state.isShowCamera ? <View> <View> <Image source={{uri:this.state.uri}} style={{width: 200, height: 200}}></Image> </View> <Button onPress={this.takePicture.bind(this)} title=‘拍照‘ ></Button> </View>: <Camera style={{ flex: 1 }} type={this.state.type} ref={(el:any)=>this.camera=el} //参照官网的Methods > <View style={{ flex: 1, backgroundColor: ‘transparent‘, flexDirection: ‘row‘, }}> <TouchableOpacity style={{ flex: 1, alignSelf: ‘flex-end‘, alignItems: ‘center‘, }} onPress={() => { this.setState({ type: this.state.type === Camera.Constants.Type.back ? Camera.Constants.Type.front : Camera.Constants.Type.back, }); }}> <Text style={{ fontSize: 18, marginBottom: 10, color: ‘white‘ }}> {‘ ‘}Flip{‘ ‘} </Text> </TouchableOpacity> {/* 复制一个开始拍照的点击按钮 */} <TouchableOpacity style={{ flex: 1, //flex为0.1改成flex为1 alignSelf: ‘flex-end‘, alignItems: ‘center‘, }} //参照官网的Methods onPress={async () => { if (this.camera) { let photo = await this.camera.takePictureAsync(); console.log(photo) this.setState({ isShowCamera: false, uri: photo.uri }) } }}> <Text style={{ fontSize: 18, marginBottom: 10, color: ‘white‘ }}> {‘ ‘}开始拍照{‘ ‘} </Text> </TouchableOpacity> </View> </Camera> } </View> ); } } takePicture(){ this.setState({ isShowCamera: true }) } }
控制台打印的photo结果:
原文地址:https://www.cnblogs.com/bai1218/p/10098655.html
时间: 2024-10-05 06:16:57