Until now, the way to get the url from file on Storage in Firebase, I used to do this taskSnapshot.getDownloadUrl, but nowadays is deprecated, which method I should use?
- 2firebase.google.com/docs/reference/android/com/google/firebase/…AskNilesh– AskNilesh2018-05-22 12:38:30 +00:00Commented May 22, 2018 at 12:38
10 Answers
As Doug says, you will need to run it inside a Task
Here is a hint of how you need to implement it
final StorageReference ref = storageRef.child("your_REF"); uploadTask = ref.putFile(file); Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() { @Override public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception { if (!task.isSuccessful()) { throw task.getException(); } // Continue with the task to get the download URL return ref.getDownloadUrl(); } }).addOnCompleteListener(new OnCompleteListener<Uri>() { @Override public void onComplete(@NonNull Task<Uri> task) { if (task.isSuccessful()) { Uri downloadUri = task.getResult(); String downloadURL = downloadUri.toString(); } else { // Handle failures // ... } } }); For more information about how to implement it, you can check this github question that was opened 7 days after I answered this https://github.com/udacity/and-nd-firebase/issues/41
7 Comments
Use this implementation for your uploadTask and will work. :)
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { Task<Uri> firebaseUri = taskSnapshot.getStorage().getDownloadUrl(); firebaseUri.addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri uri) { String url = uri.toString(); Log.e("TAG:", "the url is: " + url); String ref = yourStorageReference.getName(); Log.e("TAG:", "the ref is: " + ref); } }); } }); Comments
This code work for me.
You can try.
package br.com.amptec.firebaseapp; import android.graphics.Bitmap; import android.net.Uri; import android.provider.ContactsContract; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.Query; import com.google.firebase.database.ValueEventListener; import com.google.firebase.storage.FirebaseStorage; import com.google.firebase.storage.StorageReference; import com.google.firebase.storage.UploadTask; import java.io.ByteArrayOutputStream; import java.util.UUID; public class MainActivity extends AppCompatActivity { private DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); private FirebaseAuth auth = FirebaseAuth.getInstance(); private Button btnUpload; private ImageView imgPhoto; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnUpload = findViewById(R.id.btnUpload); imgPhoto = findViewById(R.id.imgPhoto); btnUpload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { imgPhoto.setDrawingCacheEnabled(true); imgPhoto.buildDrawingCache(); Bitmap bitmap = imgPhoto.getDrawingCache(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] imageBytes = baos.toByteArray(); String fileName = UUID.randomUUID().toString(); StorageReference storageReference = FirebaseStorage.getInstance().getReference(); StorageReference images = storageReference.child("images"); StorageReference imageRef = images.child(fileName + ".jpeg"); UploadTask uploadTask = imageRef.putBytes(imageBytes); uploadTask.addOnFailureListener(MainActivity.this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(MainActivity.this, "Upload Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } }).addOnSuccessListener(MainActivity.this, new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { //Uri url = taskSnapshot.getDownloadUrl(); Task<Uri> uri = taskSnapshot.getStorage().getDownloadUrl(); while(!uri.isComplete()); Uri url = uri.getResult(); Toast.makeText(MainActivity.this, "Upload Success, download URL " + url.toString(), Toast.LENGTH_LONG).show(); Log.i("FBApp1 URL ", url.toString()); } }); } }); } } 2 Comments
You can use StorageReference.getDownloadUrl(). Please note that it returns a Task, so you will have to remember to treat it asynchronously like you do any other Task.
3 Comments
//Create an instance of StorageReference first (here in this code snippet, it is storageRef) StorageReference filepath = storageRef.child("images.jpg"); //If file exist in storage this works. filepath.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() { @Override public void onComplete(@NonNull Task<Uri> task) { String downloadUrl = task.getResult().toString(); // downloadurl will be the resulted answer } }); Comments
Add the code below:
Task<Uri> downUrl=taskSnapshot.getMetadata().getReference().getDownloadUrl(); Log.i("url:",downUrl.getResult().toString()); 1 Comment
You wont get the download url of image now using
ImageUrl = taskSnapshot.getDownloadUrl().toString(); this method is deprecated.
Instead you can use the below method
uniqueId = UUID.randomUUID().toString(); ur_firebase_reference = storageReference.child("user_photos/" + uniqueId); Uri file = Uri.fromFile(new File(mphotofile.getAbsolutePath())); UploadTask uploadTask = ur_firebase_reference.putFile(file); Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() { @Override public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception { if (!task.isSuccessful()) { throw task.getException(); } // Continue with the task to get the download URL return ur_firebase_reference.getDownloadUrl(); } }).addOnCompleteListener(new OnCompleteListener<Uri>() { @Override public void onComplete(@NonNull Task<Uri> task) { if (task.isSuccessful()) { Uri downloadUri = task.getResult(); System.out.println("Upload " + downloadUri); Toast.makeText(mActivity, "Successfully uploaded", Toast.LENGTH_SHORT).show(); if (downloadUri != null) { String photoStringLink = downloadUri.toString(); //YOU WILL GET THE DOWNLOAD URL HERE !!!! System.out.println("Upload " + photoStringLink); } } else { // Handle failures // ... } } }); You can track the progress of uploading by adding Progress listeners,
uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() { @Override public void onProgress(UploadTask.TaskSnapshot taskSnapshot) { double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount(); System.out.println("Upload is " + progress + "% done"); Toast.makeText(mContext, "Upload is " + progress + "% done", Toast.LENGTH_SHORT).show(); } }).addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() { @Override public void onPaused(UploadTask.TaskSnapshot taskSnapshot) { System.out.println("Upload is paused"); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle unsuccessful uploads } }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { // Handle successful uploads on complete // ... } }); Comments
Just use a Task instead of ref.putFile(uriImage) .addOnSuccessListener(new OnSuccessListener() Nowadays, firebase references suggest using Uploadtask objects
I've done it like this:
UploadTask uploadTask; uploadTask = storageReferenceProfilePic.putFile(uriProfileImage ); Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() { @Override public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception { if (!task.isSuccessful()) { throw task.getException(); } // Continue with the task to get the download URL return storageReferenceProfilePic.getDownloadUrl(); } }).addOnCompleteListener(new OnCompleteListener<Uri>() { @Override public void onComplete(@NonNull Task<Uri> task) { if (task.isSuccessful()) { progressBarImageUploading.setVisibility(View.GONE); Uri downloadUri = task.getResult(); profileImageUrl = downloadUri.toString(); ins.setText(profileImageUrl); } else { // Handle failures // ... } } }); Notice these lines in the above code:
Uri downloadUri = task.getResult(); profileImageUrl = downloadUri.toString(); Now profileImageUrl contains something like "http://adressofimage" which is the url to acess the image
Now you're free to use the String profileImageUrl however you wish. For e.g., load the url into an ImageView using Glide or Fresco libraries.
