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);