【问题标题】:Expo camera in react native not saving to Media Library反应原生的 Expo 相机不保存到媒体库
【发布时间】:2021-08-22 11:30:25
【问题描述】:

我得到错误:

Possible Unhandled Promise Rejection (id: 0): TypeError: undefined is not an object (evaluating 'camera.takePicture Async')

在按照 Expo Camera 文档以 react native 运行我的应用程序时。 我的代码是这样的:

export default function App() {

  const [hasPermission, setHasPermission] = useState(null);
  
  useEffect(() => {
    (async () => {
      const { status } = await Camera.requestPermissionsAsync();
      const { status2 } = await MediaLibrary.requestPermissionsAsync();
      setHasPermission(status === 'granted');
    })();
  }, []);

  if (hasPermission === null) {
    return <View />;
  }
  if (hasPermission === false) {
    return <Text>No access to camera or photos</Text>;
  }
}

function Cam() {

   const takePicture = async () => {
    const photo = await camera.takePictureAsync()
    MediaLibrary.saveToLibraryAsync(photo.uri)
  }

  const [type, setType] = useState(Camera.Constants.Type.back);
  return (
    <View style={styles.container}>
      <Camera style={styles.camera} type={type}>
        <View style={styles.buttonContainer}>
          <TouchableOpacity
            onPress={takePicture}
            style={{
            width: 70,
            height: 70,
            bottom: 0,
            borderRadius: 50,
            backgroundColor: '#fff',
            alignItems: 'center',
            alignSelf: 'center',
          }}
          >
          </TouchableOpacity>
          <TouchableOpacity
            style={styles.button}
            onPress={() => {
              setType(
                type === Camera.Constants.Type.back
                  ? Camera.Constants.Type.front
                  : Camera.Constants.Type.back
              );
            }}>
            <Text style={{transform: [{ rotate: '90deg' }], color: 'white', textAlign: 'left'}}> Flip </Text>
          </TouchableOpacity>
        </View>
      </Camera>
    </View>
  );
}

在我尝试将拍摄的照片保存到相机之前,一切正常。我之前保存过类似的图片,所以我不知道有什么不同/错误/会导致这样的错误。

我的完整程序可以在Snack here找到

【问题讨论】:

    标签: javascript react-native expo


    【解决方案1】:

    根据official documentation,您必须创建对相机的引用。

    function Cam() {
       const cameraRef = useRef() // here
    
       const takePicture = async () => {
        const photo = await camera.current.takePictureAsync() // use it here
        MediaLibrary.saveToLibraryAsync(photo.uri)
      }
    
      const [type, setType] = useState(Camera.Constants.Type.back);
      return (
        <View style={styles.container}>
          <Camera style={styles.camera} type={type} rewf={cameraRef}> // add the reference to the existing camera component
            <View style={styles.buttonContainer}>
              <TouchableOpacity
                onPress={takePicture}
                style={{
                width: 70,
                height: 70,
                bottom: 0,
                borderRadius: 50,
                backgroundColor: '#fff',
                alignItems: 'center',
                alignSelf: 'center',
              }}
              >
              </TouchableOpacity>
              <TouchableOpacity
                style={styles.button}
                onPress={() => {
                  setType(
                    type === Camera.Constants.Type.back
                      ? Camera.Constants.Type.front
                      : Camera.Constants.Type.back
                  );
                }}>
                <Text style={{transform: [{ rotate: '90deg' }], color: 'white', textAlign: 'left'}}> Flip </Text>
              </TouchableOpacity>
            </View>
          </Camera>
        </View>
      );
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-06
      • 1970-01-01
      • 2021-06-26
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 2023-04-06
      相关资源
      最近更新 更多