react-native-camera 功能非常强大,我们可以选择使用哪个摄像头、是拍照还是录像、是否录制声音、是否开启闪光灯、视图比例、拍摄质量、拍摄方向、触摸功能、条形码/二维码扫描等等。
- 安装
rn>0.6
npm install react-native-camera --save / yarn add ...
pod install
相关权限配置详见文档:
2.用法
<RNCamera style={styles.preview} type={this.state.cameraType} flashMode={ this.state.isFlashOn === true ? RNCamera.Constants.FlashMode.on : RNCamera.Constants.FlashMode.off } whiteBalance="auto" androidCameraPermissionOptions={{ title: 'Permission to use camera', message: 'We need your permission to use your camera', buttonPositive: 'Ok', buttonNegative: 'Cancel', }} androidRecordAudioPermissionOptions={{ title: 'Permission to use audio recording', message: 'We need your permission to use your audio', buttonPositive: 'Ok', buttonNegative: 'Cancel', }} > {({ camera, status }) => { console.log(status) return ( <> {this.state.type == 2 ? ( <View style={styles.countDown}> <Text style={styles.seconds}>{this.state.countDown}s</Text> </View> ) : null} <View style={styles.operation}> <TouchableOpacity onPress={this.isShowVideofun.bind(this)}> <Text style={styles.cancel}> 取消 </Text> </TouchableOpacity> {this.state.type == 1 ? ( // 拍照 <TouchableOpacity onPress={() => this.takePicture(camera)}> <Image style={styles.tap} source={require('App/Assets/Images/tap.png')} /> </TouchableOpacity> ) : ( this.state.isRecording === false ? ( // 开始录像 <TouchableOpacity onPress={() => this.takeRecord(camera)}> <Image style={styles.tap} source={require('App/Assets/Images/play.png')} /> </TouchableOpacity> ) : ( // 停止录像 <TouchableOpacity onPress={() => this.stopRecord(camera)}> <Image style={styles.tap} source={require('App/Assets/Images/pause.png')} /> </TouchableOpacity> ) )} {/* 切换摄像头 */} <TouchableOpacity onPress={this.switchCamera.bind(this)}> <Image style={styles.cameraR} source={require('App/Assets/Images/cameraR.png')} /> </TouchableOpacity> </View> </> ) }} </RNCamera>
常用属性和方法
- type={RNCamera.Constants.Type.back/front} 设置前后摄像头
- flashMode={RNCamera.Constants.FlashMode.on/off} 是否开启闪光灯
3.拍摄视频 recordAsync()
//开始录像 takeRecord = async function(camera) { if (camera) { this.timer = setInterval(() => { this.setState({ countDown: this.state.countDown + 1, }) }, 1000) // 压缩视频 const options = { quality: RNCamera.Constants.VideoQuality['480p'], //4:3 maxFileSize: 10 * 1024 * 1024,//最大视频大小
maxDuration: 14,//最大持续时间s } try { const promise = camera.recordAsync(options) if (promise) { this.setState({ isRecording: true }) const data = await promise this.setState({ videourl: data.uri, }) } } catch (e) { console.error(e) } } } //停止录像 stopRecord(camera) { this.timer && clearInterval(this.timer) this.setState({ isRecording: false, isShowVideo: false }) camera.stopRecording() }
4.拍摄照片 takePictureAsync()
takePicture = async function(camera) { let that = this if (camera) { const options = { quality: 0.5, base64: true } try { const promisep = camera.takePictureAsync(options) if (promisep) { let curpurl = this.state.pictureurl const data = await promisep console.log('dd', this.state.pictureurl) this.setState({ // pictureurl: curpurl.concat([data.uri]),//拍摄多张 pictureurl: [data.uri], }) } } catch (e) { console.error(e) } } }
5.图片预览 拿到返回的文件地址用image标签岂可预览,视频预览播放要用到react-native-video插件。必须要设置播放容器宽高。
拍照和录视频的效果图
兼容性安卓和ios都比较良好,除了一款安卓版本有点儿老的Oppo手机录制视频失败,如果你们也遇到过我们可以互相交流哦