上传图片时出现Android FireBase错误
我正在尝试通过本地文件方法上传图片上传图片时出现Android FireBase错误,android,firebase,firebase-storage,Android,Firebase,Firebase Storage,我正在尝试通过本地文件方法上传图片 UploadTask uploadTask = currentPicRef.putFile(file, metadata); 当用户从多媒体资料中选择图像或通过相机拍照时,照片将保存在外部存储器中,我将uri保存在共享首选项中 我使用setImageURI(uri)方法成功地将图像加载到imageview中,但是当我调用firebase方法并使用相同的uri(uri file=uri.fromFile(new file(fileName));) 我得到了错误
UploadTask uploadTask = currentPicRef.putFile(file, metadata);
当用户从多媒体资料中选择图像或通过相机拍照时,照片将保存在外部存储器中,我将uri保存在共享首选项中
我使用setImageURI(uri)
方法成功地将图像加载到imageview中,但是当我调用firebase方法并使用相同的uri(uri file=uri.fromFile(new file(fileName));
)我得到了错误 找不到要上载的文件:file:///content%3A/media/external/images/media/22943 但是当我使用log检查本地文件时 uri是content://media/external/images/media/22943 还值得一提的是,当我在firebase中使用
uri.parse()
而不是uri.fromFile()
从本地文件上载时,它上载了元数据,但没有上载照片本身
有什么办法吗?不管怎样,可能有点晚了: 找不到要上载的文件:file:///content%3A/media/external/images/media/22943 我认为您可能存在url编码问题(请参阅文件uri中的%3A) 尝试解码uri
urifile=uri.fromFile(新文件名))代码>,然后将其传递给Firebase存储引用
如果它不起作用,您可以尝试在共享首选项中保存本地图像路径(我假设,当您从gallery或camera获取图像时,您也可以拥有本地路径),并使用此方法将图像上载到存储Firebase中
希望能有所帮助。文件名可以确定文件URI.toString()
。这对我很有用:
Uri uploadUri = Uri.fromFile(new File(fileUri.toString()));
下面是一个有效的示例:
// [START upload_from_uri]
private void uploadFromUri(Uri fileUri) {
Uri uploadUri = Uri.fromFile(new File(fileUri.toString()));
Log.d(TAG, "uploadFromUri:src:" + fileUri.toString());
// [START get_child_ref]
// Get a reference to store file at photos/<FILENAME>.jpg
final StorageReference photoRef = mStorageRef.child("photos").child(uploadUri.getLastPathSegment());
// [END get_child_ref]
// Upload file to Firebase Storage
// [START_EXCLUDE]
showProgressDialog();
// [END_EXCLUDE]
Log.d(TAG, "uploadFromUri:dst:" + photoRef.getPath());
photoRef.putFile(uploadUri)
.addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
// Upload succeeded
Log.d(TAG, "uploadFromUri:onSuccess");
// Get the public download URL
mDownloadUrl = taskSnapshot.getMetadata().getDownloadUrl();
// [START_EXCLUDE]
hideProgressDialog();
updateUI(mAuth.getCurrentUser());
// [END_EXCLUDE]
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Upload failed
Log.w(TAG, "uploadFromUri:onFailure", exception);
mDownloadUrl = null;
// [START_EXCLUDE]
hideProgressDialog();
Toast.makeText(MainActivity.this, "Error: upload failed",
Toast.LENGTH_SHORT).show();
updateUI(mAuth.getCurrentUser());
// [END_EXCLUDE]
}
});
}
// [END upload_from_uri]
/[从uri开始上传]
私有void uploadFromUri(Uri fileUri){
Uri uploadUri=Uri.fromFile(新文件(fileUri.toString());
d(标记为uploadFromUri:src:+fileUri.toString());
//[开始获取儿童参考]
//获取存储文件在photos/.jpg的引用
final-StorageReference photoRef=mStorageRef.child(“照片”).child(uploadUri.getLastPathSegment());
//[END get_child_ref]
//将文件上载到Firebase存储
//[开始时不包括]
showProgressDialog();
//[完]
Log.d(标记“uploadFromUri:dst:+photoRef.getPath());
photoRef.putFile(上传URI)
.addOnSuccessListener(此,新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
//上传成功
d(标记“uploadFromUri:onSuccess”);
//获取公共下载URL
mDownloadUrl=taskSnapshot.getMetadata().getDownloadUrl();
//[开始时不包括]
hideProgressDialog();
updateUI(mAuth.getCurrentUser());
//[完]
}
})
.addOnFailureListener(此,新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
//上载失败
w(标记“uploadFromUri:onFailure”,异常);
mDownloadUrl=null;
//[开始时不包括]
hideProgressDialog();
Toast.makeText(MainActivity.this,“错误:上载失败”,
吐司。长度(短)。show();
updateUI(mAuth.getCurrentUser());
//[完]
}
});
}
//[结束从\u uri上传\u]