Cómo obtener URL de Firebase Storage getDownloadURL

Intento obtener el “enlace de descarga persistente a largo plazo” para los archivos en nuestro depósito de almacenamiento de Firebase. Cambié los permisos de esto a

service firebase.storage { match /b/project-xxx.appspot.com/o { match /{allPaths=**} { allow read, write; } } } 

Y mi javacode se ve así:

 private String niceLink (String date){ String link; // Points to the root reference StorageReference storageRef = FirebaseStorage.getInstance().getReference(); StorageReference dateRef = storageRef.child("/" + date+ ".csv"); link = dateRef.getDownloadUrl().toString(); return link; } 

Cuando ejecuto esto obtengo el enlace uri que se parece a com.google.android.gms.tasks.zzh@xxx

Pregunta 1. ¿Puedo obtener de este enlace el enlace de descarga similar a: https://firebasestorage.googleapis.com/v0/b/project-xxxx.appspot.com/o/20-5-2016.csv?alt=media&token= b5d45a7f-3ab7-4f9b-b661-3a2187adxxxx

Al tratar de obtener el enlace de arriba, cambié la última fila antes de mi regreso, así:

 private String niceLink (String date){ String link; // Points to the root reference StorageReference storageRef = FirebaseStorage.getInstance().getReference(); StorageReference dateRef = storageRef.child("/" + date+ ".csv"); link = dateRef.getDownloadUrl().getResult().toString(); return link; } 

Pero al hacer esto, recibo un error 403 y la aplicación se bloquea. La consola me dice que esto es porque el usuario no ha iniciado sesión / auth. “Por favor, inicia sesión antes de pedir token”

Pregunta 2. ¿Cómo soluciono esto?

Cuando llama a getDownloadUrl() , la llamada es asincrónica y debe suscribirse en una callback exitosa para obtener los resultados:

 // Calls the server to securely obtain an unguessable download Url private void getUrlAsync (String date){ // Points to the root reference StorageReference storageRef = FirebaseStorage.getInstance().getReference(); StorageReference dateRef = storageRef.child("/" + date+ ".csv"); dateRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(Uri downloadUrl) { //do something with downloadurl } }); } 

Esto devolverá una url pública de descarga indescifrable. Si acabas de subir un archivo, esta url pública estará en la exitosa callback de la carga (no necesitas llamar a otro método asíncrono después de que hayas subido).

Sin embargo, si todo lo que quiere es una representación de String de la referencia, puede simplemente llamar a .toString()

 // Returns a Uri of the form gs://bucket/path that can be used // in future calls to getReferenceFromUrl to perform additional // actions private String niceRefLink (String date){ // Points to the root reference StorageReference storageRef = FirebaseStorage.getInstance().getReference(); StorageReference dateRef = storageRef.child("/" + date+ ".csv"); return dateRef.toString(); }