android - 如何在firebase storage v16.0.1中获取上传图片的url
问题描述
我已经成功地将图像发布到 Firebase 存储,但我想知道是否可以在 Firebase 数据库中有一个链接/url,我可以从中单击将我重定向到 Firebase 存储以查看该图像。
我想要这个功能,以便与标题、日期、备注等用户输入一起,最终用户将能够看到带有链接的“图像”子项以及其他输入
我曾尝试在 StackOverflow 和 Youtube 上搜索答案,但它们中的大多数都是旧的并且似乎已经过时了。有一个 command getDownloadUrl
,但我相信它已被弃用。
这是我的课程中将我的图像上传到 Firebase 存储的代码。在哪里添加storagerefernce.downloadUrl()
。
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
storage = FirebaseStorage.getInstance();
storageReference = storage.getReference();
btnChoose = (ImageButton) findViewById(R.id.btnChoose);
imageView = (ImageView) findViewById(R.id.imgView);
btnChoose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
chooseImage();
}
});
}
public void chooseImage() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"),PICK_IMAGE_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null )
{
filePath = data.getData();
imgname = filePath.getLastPathSegment();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
imageView.setImageBitmap(bitmap);
uploadImage();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
private void uploadImage()
{
if(filePath != null)
{
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Uploading...");
progressDialog.show();
StorageReference ref = storageReference.child("images/"+ imgname);
ref.putFile(filePath)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
progressDialog.dismiss();
Toast.makeText(MainActivity.this, "Uploaded", Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
progressDialog.dismiss();
Toast.makeText(MainActivity.this, "Failed "+e.getMessage(), Toast.LENGTH_SHORT).show();
}
})
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double progress = (100.0*taskSnapshot.getBytesTransferred()/taskSnapshot
.getTotalByteCount());
progressDialog.setMessage("Uploaded "+(int)progress+"%");
}
});
}
}
}
解决方案
你可以试试这个方法。
val ref = mStorageReference?.child("images/mMobileNumber.jpg")
val uploadTask = ref?.putFile(Uri.fromFile(File(mImagePath)))
uploadTask?.continueWithTask(Continuation<UploadTask.TaskSnapshot, Task<Uri>>
{ task ->
if (!task.isSuccessful) {
task.exception?.let {
throw it
}
}
return@Continuation ref.downloadUrl
})?.addOnCompleteListener { task ->
if (task.isSuccessful) {
val downloadUri = task.result
mTempDatabaseReference?.child("image")?.setValue(downloadUri.toString())
} else {
// Handle failures
// ...
}
}
推荐阅读
- rcpp - 使用 Rcpp 返回列表中向量的大小
- angular - Angular 9: How to access the result of async pipe in HTML from canDeactivate function in component code?
- android - Will Handler callbacks be removed when onDestroy() is bypassed?
- c - 需要 C 中 strcpy 方面的指导
- firebase - 如何防止匿名用户通过 Firestore 安全规则执行某些操作?
- c++ - How to fritzing on Linux
- vue.js - 从 Buefy 表中获取新排序的数据
- c - 包含 error.h 头文件在 c 中给我一个错误
- javascript - Javascript,发送前打印结果
- php - 选择 2 不填充选项,但返回数据格式正确?