[Unhandled promise rejection: TypeError: undefined is not an object (evaluating '_expoMediaLibrary.MediaLibrary.createAssetAsync')]

[Unhandled promise rejection: TypeError: undefined is not an object (evaluating '_expoMediaLibrary.MediaLibrary.createAssetAsync')]

我使用 expo-camera 录制视频并将其保存在我的设备中,但即使在停止录制时它也有视频 uri,.MediaLibrary.createAssetAsync 出现上述错误,并且录制从第一个即使我已经使用 setTimeout 停止录制,这是我的相机代码:

import React, { useState, useEffect, useRef } from 'react';
import { Text, View } from 'react-native';
import { Camera } from 'expo-camera';
import { MediaLibrary } from 'expo-media-library';
import { Audio } from 'expo-av';

export default function App() {
  const [hasPermission, setHasPermission] = useState(null);
  const [camera, setCamera] = useState(null);
  const [recording, setRecording] = useState(false);
  const [video, setVideo] = useState(null);
  const [stop, setStop] = useState(false);

  const recordingVideo = async () => {
    const video = await camera.recordAsync();
    console.log(video);
    setVideo(video);
  }

  const saveVideo = async () => {
    console.log('uri', video.uri);
    const asset = await MediaLibrary.createAssetAsync(video.uri);
    if (asset) {
      console.log('asset', asset);
      setVideo(null);
    }
  };

  useEffect(() => {
    console.log('recoring', recording);
    if (recording && camera) recordingVideo();
  }, [recording, camera]);

  useEffect(() => {
    console.log('stop', stop);

    if (stop) {
      setRecording(false);
      camera.stopRecording();
      saveVideo();
    }
  }, [stop]);

  useEffect(() => {
    (async () => {
      const { status } = await Camera.requestPermissionsAsync();
      const audioPerm = await Audio.requestPermissionsAsync();
      setHasPermission(status === 'granted' && audioPerm.status === 'granted');
    })();
  }, []);

  useEffect(() => {
    if(camera) {
      console.log('ref');
      setRecording(true);

      setTimeout(() => {
        setStop(true);
      }, 10000);
    }
  }, [camera]);

  if (hasPermission === null) {
    return <View />;
  }

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

  return (
    <View style={{ flex: 1 }}>
      <Camera style={{ flex: 1 }} type={Camera.Constants.Type.front} ref={ref => setCamera(ref)}>
        <View style={{ flex: 1, backgroundColor: '#00000000', justifyContent: 'center' }}>
          <Text style={{ marginHorizontal: 40 }}>{recording ? 'Recording' : !stop ? 'Waiting for recording' : 'recording finished' }</Text>
        </View>
      </Camera>
    </View>
  );
}

我在 expo-media-library 文档中搜索并记录了 video.uri 这正是一些匹配参数,但无法理解为什么它会这样工作。

我在我的相机应用程序中遇到了同样的问题。我通过更改 import

解决了
// Change from this
import { MediaLibrary } from 'expo-media-library';
// To this
import * as MediaLibrary from 'expo-media-library';