【问题标题】:How to access the camera - React Native如何访问相机 - React Native
【发布时间】:2017-12-29 08:40:13
【问题描述】:

这应该包含在 react-native API 中,但我似乎找不到任何开箱即用的 API。

我想通过单击按钮打开相机。我可以看到一些仅适用于 iOS 的 API,但 react-native 应该可以跨平台。

有谁知道如何使用 react-native 访问相机(而不是图库)?

【问题讨论】:

    标签: android ios react-native


    【解决方案1】:

    您可能希望为此使用react-native-camera 模块。

    这是该库的示例用法:

    'use strict';
    import React, { Component } from 'react';
    import {
      AppRegistry,
      Dimensions,
      StyleSheet,
      Text,
      TouchableHighlight,
      View
    } from 'react-native';
    import Camera from 'react-native-camera';
    
    class BadInstagramCloneApp extends Component {
      render() {
        return (
          <View style={styles.container}>
            <Camera
              ref={(cam) => {
                this.camera = cam;
              }}
              style={styles.preview}
              aspect={Camera.constants.Aspect.fill}>
              <Text style={styles.capture} onPress={this.takePicture.bind(this)}>[CAPTURE]</Text>
            </Camera>
          </View>
        );
      }
    
      takePicture() {
        const options = {};
        //options.location = ...
        this.camera.capture({metadata: options})
          .then((data) => console.log(data))
          .catch(err => console.error(err));
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        flexDirection: 'row',
      },
      preview: {
        flex: 1,
        justifyContent: 'flex-end',
        alignItems: 'center'
      },
      capture: {
        flex: 0,
        backgroundColor: '#fff',
        borderRadius: 5,
        color: '#000',
        padding: 10,
        margin: 40
      }
    });
    
    AppRegistry.registerComponent('BadInstagramCloneApp', () => BadInstagramCloneApp);
    

    【讨论】:

    • 那个模块还不是 react-native 官方的。
    • 反应原生版本?
    • Javascript 是一个大型社区。您可以检查该模块的构建是否通过。并决定是否要使用它。
    • @VirkBilal 没有“官方”的 react-native 相机库。 react-native-camera 是目前最接近的,在 Github 上有近 6K 星。您也可以查看react-native-camera-kitgithub.com/wix/react-native-camera-kit
    • 我在使用 react native 相机时遇到了很多问题,如果我只是写了一个使用默认相机应用程序的意图 github.com/react-native-community/react-native-camera/issues/…,我会节省大约 1 个月的时间
    【解决方案2】:

    在 React Native 中,您可以通过首先使用 NPM 安装来访问相机: npm install react-native-camera --save react-native 链接 react-native-camera

    然后在你的组件中使用它:

    takePicture() {
    const options = {};
    //options.location = ...
    this.camera.capture({metadata: options})
      .then((data) => console.log(data))
      .catch(err => console.error(err));
    }
    

    完整示例请参见此 github 存储库: https://github.com/lwansbrough/react-native-camera

    【讨论】:

      【解决方案3】:

      我发现 react-native-picker 图像选择器更适合我的需要,它可用于相机和画廊。对于下面的示例,您需要安装版本:“react-native-image-picker”:“^3.3.2”,

      https://www.npmjs.com/package/react-native-image-picker

      import React, {useState, useEffect} from 'react';
      import {StyleSheet, Text, View, Image} from 'react-native';
      import cameraImage from '../../../../assets/icons/camera.png';
      import galleryImage from '../../../../assets/icons//gallery.png';
      import {TouchableWithoutFeedback} from 'react-native-gesture-handler';
      import * as ImagePicker from 'react-native-image-picker';
      import {PermissionsAndroid} from 'react-native';
      const ImagePicker = () => {
        const [responseCamera, setResponseCamera] = React.useState(null);
        const [responseGallery, setResponseGallery] = React.useState(null);
      
        const openCameraWithPermission = async () => {
          try {
            const granted = await PermissionsAndroid.request(
              PermissionsAndroid.PERMISSIONS.CAMERA,
              {
                title: 'App Camera Permission',
                message: 'App needs access to your camera ',
                buttonNeutral: 'Ask Me Later',
                buttonNegative: 'Cancel',
                buttonPositive: 'OK',
              },
            );
            if (granted === PermissionsAndroid.RESULTS.GRANTED) {
              ImagePicker.launchCamera(
                {
                  mediaType: 'photo',
                  includeBase64: false,
                  maxHeight: 200,
                  maxWidth: 200,
                },
                (response) => {
                  console.log(response);
                  setResponseCamera(response);
                  setResponseGallery(null);
                },
              );
            } else {
              console.log('Camera permission denied');
            }
          } catch (err) {
            console.warn(err);
          }
        };
      
        return (
          <View
            style={{
              display: 'flex',
              flexDirection: 'row',
              justifyContent: 'space-around',
              margin: 4,
            }}>
            <TouchableOpacity onPress={() => openCameraWithPermission()}>
              {responseCamera === null ? (
                <Image style={styles.icon} source={cameraImage} />
              ) : (
                <Image style={styles.icon} source={{uri: responseCamera.uri}} />
              )}
            </TouchableOpacity>
            <TouchableOpacity
              onPress={() =>
                ImagePicker.launchImageLibrary(
                  {
                    mediaType: 'photo',
                    includeBase64: false,
                    maxHeight: 200,
                    maxWidth: 200,
                  },
                  (response) => {
                    setResponseGallery(response);
                    setResponseCamera(null);
                  },
                )
              }>
              {responseGallery === null ? (
                <Image style={styles.icon} source={galleryImage} />
              ) : (
                <Image style={styles.icon} source={{uri: responseGallery.uri}} />
              )}
            </TouchableOpacity>
          </View>
        );
      };
      
      const styles = StyleSheet.create({
        icon: {
          height: 50,
          width: 50,
        },
      });
      
      export default ImagePicker;
      
      

      安卓权限:

      <uses-permission android:name="android.permission.CAMERA" />
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      <uses-feature android:name="android.hardware.camera" />
      
      

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 2020-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-12
        • 2015-06-01
        • 2020-06-20
        • 1970-01-01
        相关资源
        最近更新 更多