Link

GitHub Documentación

Firebase Storage

Firebase Storage nos permite alojar ficheros, ya sean audios, videos, etc.

No olvides configurar las reglas también en Firebase Storage:

Android

El primer paso es instanciar la clase FirebaseStorageReference a través la cual realizaremos todas las acciones:

StorageReference mStorageRef = FirebaseStorage.getInstance().getReference();

Subir imagen

public void upload(View v) {
    Uri file = Uri.parse("android.resource://" + getPackageName() + "/" + R.drawable.captura);
    StorageReference riversRef = mStorageRef.child("images/rivers.jpg");

    riversRef.putFile(file)
            .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    // Get a URL to the uploaded content
                    //Uri downloadUrl = taskSnapshot.getDownloadUrl();
                    Log.d("prueba", "completada la subida");
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    Log.d("prueba", "fallo subida");
                }
            });
}

En este caso se selecciona una imagen del dispositivo a través de su URI. Teniendo esa referencia, el método putFile() guarda el fichero en Firebase con la ruta y nombre especifiados en StorageReference. En caso de no existir la ruta de destino images/ se creará.

Descargar imagen

Cuando consultemos a Firebase Storage por una imagen nos proporcionará una URI que nos llevará a la imagen seleccionada. Esa URI la podremos utilizar para, por ejemplo, cargar una imagen en un ImageView, aunque para hacerlo debemos de utilizar una librería externa. En este caso se utiliza Picasso:

implementation 'com.squareup.picasso:picasso:2.71828'

Y para descargar:

public void download(View v) throws IOException {
    final StorageReference riversRef = mStorageRef.child("images/rivers.jpg");

    final File localFile = File.createTempFile("images", "jpg");
    riversRef.getFile(localFile)
            .addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                    // Successfully downloaded data to local file
                    riversRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            ImageView imageView = findViewById(R.id.imageView);

                            Log.d("prueba", "onSuccess: uri= "+ uri.toString());
                            Picasso.get().load(uri.toString()).into(imageView);
                        }
                    });
                    Log.d("prueba", "completada la descarga " );
                }
            }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle failed download
            Log.d("prueba", "fallo descarga");
        }
    });
}