Javascript 世博相机无法将图片保存到画廊-为什么这么难?

Javascript 世博相机无法将图片保存到画廊-为什么这么难?,javascript,react-native,react-hooks,expo,Javascript,React Native,React Hooks,Expo,我可以拍一张照片,之后它甚至会显示预览,但它不会保存到图库中 在我添加了MediaLibrary.createAssetAsync之后,它甚至不会在拍照后显示图像预览,也不会保存到多媒体资料(或任何本地存储)中 这几天我都不知道哪里出了问题。请提供任何提示或提示 //imports import { Camera } from "expo-camera"; import * as MediaLibrary from 'expo-media-library'; im

我可以拍一张照片,之后它甚至会显示预览,但它不会保存到图库中

  • 在我添加了
    MediaLibrary.createAssetAsync
    之后,它甚至不会在拍照后显示图像预览,也不会保存到多媒体资料(或任何本地存储)中

  • 这几天我都不知道哪里出了问题。请提供任何提示或提示

       //imports
    import { Camera } from "expo-camera";
    import * as MediaLibrary from 'expo-media-library';
    import * as Permissions from 'expo-permissions';
      
       // useState
      const [hasPermission, setHasPermission] = useState(null);
      const [rollPermision, setRollPermission] = useState(null);
    
     // useEffect and ref to the camera
      const cameraRef = useRef();
    
      useEffect(() => {
          (async () => {
            const { status } = await Camera.requestPermissionsAsync();
            setHasPermission(status === "granted");
          // camera roll
            const { cam_roll } = await Permissions.askAsync(Permissions.CAMERA_ROLL);
            setRollPermission(cam_roll === "granted");
            setRollPermission(true);
        }
        )();
      }, []);
    
    // shutter button function to take picture
      const takePicture = async () => {
        if (cameraRef.current) {
          const options = { quality: 0.5, base64: true, skipProcessing: true };
          const data = await cameraRef.current.takePictureAsync(options);
          //camera roll (saving picture)
          const asset = await MediaLibrary.createAssetAsync(data);
    
          const source = asset.uri;
          if (source) {
            await cameraRef.current.pausePreview();
            setIsPreview(true);
            console.log("picture source", source);
          }
        }
      };
    
    
     //if statement if it hit an error
          if (hasPermission === null || rollPermision === null) {
        return <View />;
      }
      if (hasPermission === false || rollPermision === false) {
        return <Text style={styles.text}>No access to camera</Text>;
      }
    
    //导入
    从“expo Camera”导入{Camera};
    从“世博媒体库”导入*作为媒体库;
    从“expo Permissions”导入*作为权限;
    //使用状态
    const[hasPermission,setHasPermission]=useState(null);
    const[RollPermission,setRollPermission]=useState(null);
    //对摄影机使用效果和参照
    const cameraRef=useRef();
    useffect(()=>{
    (异步()=>{
    const{status}=wait-Camera.requestPermissionsAsync();
    setHasPermission(状态==“已授予”);
    //照相胶卷
    const{cam_roll}=wait Permissions.askAsync(Permissions.CAMERA_roll);
    setRollPermission(cam_roll==“已授予”);
    setRollPermission(true);
    }
    )();
    }, []);
    //快门按钮拍照功能
    const takePicture=async()=>{
    如果(当前摄影机引用){
    const options={quality:0.5,base64:true,skipProcessing:true};
    const data=wait cameraRef.current.takePictureAsync(选项);
    //相机卷(保存图片)
    const asset=await MediaLibrary.createAssetAsync(数据);
    const source=asset.uri;
    如果(来源){
    等待cameraRef.current.pausePreview();
    setIsPreview(true);
    console.log(“图片源”,source);
    }
    }
    };
    //if语句,如果它遇到错误
    if(hasPermission==null | | rollPermission==null){
    返回;
    }
    if(hasPermission==false | | rollPermission==false){
    不允许进入摄像机;
    }
    
    应该是:

        const asset = await MediaLibrary.createAssetAsync(data.uri);
     or
        const { uri } = await cameraRef.current.takePictureAsync(options);
        const asset = await MediaLibrary.createAssetAsync(uri);
    

    您必须保存data.uri,而不是数据本身。如果您使用console.log(data),您将看到它是一个包含缓存中存储的映像的uri的对象。

    omg
    const-asset=wait-mediabrary.createAssetSync(data.uri)工作!为什么它必须是
    data.uri
    ?我对此感到非常困惑,因为文档一直说它是一个localUri,甚至在他们的示例中,当他们调用摄影机
    uri
    并在
    createAssetAsync
    中调用它时,我这样做了,但我已经将字符串
    uir
    更改为
    data
    。似乎需要实际的工作
    uri
    。数据是一个包含有关图像的以下信息的对象:{uri,width,height,exif,base64}。在文档中的示例中,他们使用ES6的解引用直接从返回的对象提取uri。常量{uri}=。。。所以,当时可能会有点困惑。无论如何,很高兴我能帮上忙。
        const asset = await MediaLibrary.createAssetAsync(data.uri);
     or
        const { uri } = await cameraRef.current.takePictureAsync(options);
        const asset = await MediaLibrary.createAssetAsync(uri);