我从我的应用程序上传图片并将下载URL存储在一个模型类中,但是在我看到URL之后,我复制并粘贴了链接,但是它没有打开图像。
以下是Firebase实时数据库映像

这里是Firebase存储

Java文件
Upload_Fragment.java
public class Upload_Fragment extends Fragment {
private static final int PICK_IMAGE_REQUEST = 10;
private ImageView uploadImageView;
private Uri mImageUri;
private StorageReference storageReference;
private DatabaseReference databaseReference;
private StorageTask mUploadTask;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_upload, container, false);
Button chooseImageButton = view.findViewById(R.id.upload_image_button);
Button uploadImageButton = view.findViewById(R.id.done_button);
uploadImageView = view.findViewById(R.id.upload_image_view);
FirebaseStorage storage = FirebaseStorage.getInstance();
storageReference = storage.getReference("uploads");
databaseReference = FirebaseDatabase.getInstance().getReference("uploads");
chooseImageButton.setOnClickListener(v -> openFileChooser());
uploadImageButton.setOnClickListener(v -> {
if (mUploadTask != null && mUploadTask.isInProgress()) {
Toast.makeText(getActivity(), "Upload in Progress", Toast.LENGTH_SHORT).show();
} else {
uploadToFirebase(mImageUri);
}
});
return view;
}
private void openFileChooser() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, PICK_IMAGE_REQUEST);
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
&& data != null && data.getData() != null) {
mImageUri = data.getData();
Picasso.get().load(mImageUri).into(uploadImageView);
}
}
private String getFileExtension(Uri uri) {
ContentResolver contentResolver = Objects.requireNonNull(getActivity()).getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
return mime.getExtensionFromMimeType(contentResolver.getType(uri));
}
private void uploadToFirebase(Uri mImageUri) {
if (mImageUri != null) {
final ProgressDialog progressDialog = new ProgressDialog(getActivity());
progressDialog.setTitle("Uploading...");
progressDialog.show();
StorageReference reference = storageReference.child(System.currentTimeMillis()
+ "." + getFileExtension(mImageUri));
reference.putFile(mImageUri)
.addOnSuccessListener(taskSnapshot -> {
progressDialog.dismiss();
Toast.makeText(getActivity(), "Saved Succesfully", Toast.LENGTH_SHORT).show();
reference.getDownloadUrl()
.addOnSuccessListener(uri -> {
Upload upload = new Upload(mImageUri.toString());
String uploadId = databaseReference.push().getKey();
databaseReference.child(uploadId).setValue(upload);
});
})
.addOnProgressListener(snapshot -> {
double progress = (100.0 * snapshot.getBytesTransferred() / snapshot
.getTotalByteCount());
progressDialog.setMessage("Uploaded " + (int) progress + "%");
})
.addOnFailureListener(e -> {
progressDialog.dismiss();
Toast.makeText(getActivity(), "Error Ocurred" + e.getMessage(), Toast.LENGTH_SHORT).show();
});
}
}
}Upload.java //这是模型类
public class Upload {
private String mImageUrl;
public Upload() {
}
public Upload(String imageUrl) {
mImageUrl = imageUrl;
}
public String getmImageUrl() {
return mImageUrl;
}
public void setmImageUrl(String mImageUrl) {
this.mImageUrl = mImageUrl;
}
}发布于 2021-04-13 04:47:49
在uploadToFirebase方法中
reference.getDownloadUrl().addOnSuccessListener(uri -> {.....
您将得到实际的url,并解决您的问题,而不是mImageUri.toString()按照bellow.So的方式放置uri.toString()。
private void uploadToFirebase(Uri mImageUri) {
if (mImageUri != null) {
final ProgressDialog progressDialog = new ProgressDialog(getActivity());
progressDialog.setTitle("Uploading...");
progressDialog.show();
StorageReference reference = storageReference.child(System.currentTimeMillis()
+ "." + getFileExtension(mImageUri));
reference.putFile(mImageUri)
.addOnSuccessListener(taskSnapshot -> {
progressDialog.dismiss();
Toast.makeText(getActivity(), "Saved Succesfully", Toast.LENGTH_SHORT).show();
reference.getDownloadUrl()
.addOnSuccessListener(uri -> {
Upload upload = new Upload(uri.toString());
String uploadId = databaseReference.push().getKey();
databaseReference.child(uploadId).setValue(upload);
});
})
.addOnProgressListener(snapshot -> {
double progress = (100.0 * snapshot.getBytesTransferred() / snapshot
.getTotalByteCount());
progressDialog.setMessage("Uploaded " + (int) progress + "%");
})
.addOnFailureListener(e -> {
progressDialog.dismiss();
Toast.makeText(getActivity(), "Error Ocurred" + e.getMessage(), Toast.LENGTH_SHORT).show();
});
}
}发布于 2021-04-12 19:53:10
在数据库模式中,"mImageUrl“属性包含一个类似于以下内容的URL:
content://com.android.externalstorage.documents...正如您可能看到的,这些URL指向一些文件,这些文件位于外部存储空间的本地。因此,您不能使用这样的URL并期望从Firebase存储中读取数据。若要检查Firebase控制台中图像的URL,请在右侧查看名为“文件位置”的部分。如果您单击令牌,您将得到该图像的URL的副本,它看起来类似于以下内容:
https://firebasestorage.googleapis.com/v0/b/myapp-not-final.appspot.com/...这意味着这是应该存储在数据库和中的正确的URL,而不是本地的。要获得下载URL,请查看以下帖子中的我的答案:
一旦您有了正确的URL,将其添加到Firestore,以便以后可以使用它。
https://stackoverflow.com/questions/67062937
复制相似问题