[Отклонение необработанного обещания: ошибка типа: неопределенный не является объектом (оценка ‘_expoMediaLibrary.MediaLibrary.createAssetAsync’)]

#reactjs #react-native #expo #react-native-android #expo-camera

#reactjs #expo #react-native #expo-camera

Вопрос:

Я использую 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 amp;amp; 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' amp;amp; 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 именно такой параметр соответствия, но не могу понять, почему он так работает.

Комментарии:

1. Вы нашли решение?

Ответ №1:

У меня была такая же проблема в моем приложении камеры. Я решил, изменив свой импорт

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