【发布时间】:2022-01-03 19:44:05
【问题描述】:
我目前正在开发一个 react-native 项目,用户可以将视频从他的应用上传到 firebase 存储。
用户可以从他的库中选择一个视频,也可以直接在应用程序中获取一个新视频。我使用react-native-image-picker 库。
在 IO 上,一切都按预期工作。在 Android 上,我只能上传直接在应用中拍摄的视频或 小视频 从 android 图库。
如果我尝试从 android 图库上传视频,我会遇到两个问题:
- 错误:[存储/未知]权限被拒绝:从 pid=32673,uid= 读取 com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/video:723 10226 要求您使用 ACTION_OPEN_DOCUMENT 或相关 API 获得访问权限
如果尝试使用我从图像选择器库中获得的链接直接上传视频,则会出现此错误。
let reference = storage().ref(path);
let task = reference.putFile(imagePickerResponse.assets[0].uri);
我设法通过使用 RNFS 库解决了这个问题。 react-native-fs
const data = await RNFS.readFile(imagePickerResponse.assets[0].uri, 'base64');
let task = reference.putString(data, 'base64');
但此解决方案仅适用于小文件。对于较长的视频,应用程序崩溃,我收到以下错误。
- 无法调用 RNFSManager.readFile:
Could not invoke RNFSManager.readFile
null
Failed to allocate a 268435472 byte allocation with
6291456 free bytes and 116MB until OOM, target
footprint 152234472, growth limit 268435456
很遗憾,我在网上找不到任何解决方案。 有没有办法将大视频从 Android 库上传到 Firestore 存储?
图像选择器代码
export const SelectVideoAction: CameraAction = {
title: 'Select Video',
type: 'library',
options: {
selectionLimit: 0,
mediaType: 'video',
},
};
launchImageLibrary(SelectVideoAction.options, handleResponse);
Android 上传代码
let reference = storage().ref(targetPath);
let task = reference.putFile(imagePickerResponse.assets[0].uri);
if (Platform.OS === 'android' && fromLibrary) {
const data = await RNFS.readFile(imagePickerResponse.assets[0].uri, 'base64');
task = reference.putString(data, 'base64');
}
task
.then(() => {
console.log('Image uploaded to the bucket!');
})
.catch((e) => console.log('uploading image error => ', e));
依赖关系
"dependencies": {
...
"react": "17.0.2",
"react-native": "0.66.3",
"react-native-image-picker": "^4.0.6",
"react-native-fs": "^2.18.0",
...
}
【问题讨论】:
标签: android react-native firebase-storage react-native-image-picker