Durante la conferencia Google I / O de 2016, Firebase se reintrodujo en la comunidad de desarrolladores como una herramienta importante para proporcionar soporte rápido de back-end para páginas web y aplicaciones móviles. Este tutorial le presentará la funcionalidad de almacenamiento y recuperación de archivos disponible para sus aplicaciones de Android.
Para obtener más información sobre la base de datos, análisis, informes de fallos y autenticación en tiempo real de Firebase, consulte algunos de nuestros otros tutoriales aquí en Envato Tuts+.
En aras de la brevedad, omitiremos el proceso de configuración general de Firebase en su aplicación de Android y la consola de Firebase. Si esta es la primera vez que prueba Firebase en una aplicación, le sugiero que primero lea el artículo de Ashraff Hathibelagal Introducción a Firebase para Android.
Antes de que pueda comenzar a usar Firebase Storage, deberá asegurarse de que su usuario esté autenticado o cambiar las reglas de requisitos de autenticación en la Consola de Firebase para permitir que los usuarios no autenticados accedan y carguen archivos. Para mantener las cosas simples, haremos lo último. Comencemos por entrar en la sección de Almacenamiento de Firebase seleccionando Almacenamiento en la columna de navegación izquierda.
A continuación, notará que hay dos pestañas en la parte superior de la Almacenamiento pantalla: Archivos y Reglas.
Selecciona el Reglas pestaña, y en la linea permitir leer, escribir: si request.auth! = null;
, cambio !=
a ==
y haga clic en el PUBLICAR botón.
Ahora, cualquier usuario de su aplicación debería poder cargar o descargar archivos de su servidor de Firebase. Si bien esto no es ideal para un entorno de producción, facilitará mucho el aprendizaje de Firebase Storage sin tener que buscar en el código de autenticación..
Si bien la capacidad de cargar archivos desde una aplicación es excelente, a veces simplemente querrá almacenar los archivos en un lugar al que se pueda acceder fácilmente y que se pueda acceder a la aplicación. Aquí es donde el poder cargar manualmente los archivos desde la Consola Firebase entra en juego. Bajo la Archivos pestaña, verás un botón azul titulado Subir archivo.
Haga clic en eso y seleccione el archivo que desea cargar, y aparecerá en su Firebase Storage..
Al seleccionar ese archivo en la consola, aparecerá una vista detallada que le permitirá inspeccionar los archivos que se han cargado previamente..
Ahora que tiene un archivo almacenado en Firebase, avancemos y bajemos hacia una aplicación. Usaremos un diseño simple en nuestro Actividad principal
que contiene un ImageView
con un carné de identidad
de imagen.
Para acceder a sus archivos de almacenamiento de Firebase, primero deberá obtener una referencia al FirebaseStorage
objeto, y luego crear una StorageReference
a la URL de su proyecto y al archivo que desea descargar. Puede encontrar la URL de su proyecto en la parte superior de la Archivos Sección de Almacenamiento en la consola de Firebase.
FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageRef = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("android.jpg");
A continuación, puede crear un Expediente
Objeto e intenta cargar el archivo que deseas llamando Obtener el archivo
en tu StorageReference
con el nuevo Expediente
objeto pasado como un parámetro. Como esta operación se realiza de forma asíncrona, puede agregar un OnSuccessListener
y OnFailureListener
a su llamada para manejar cualquier contingencia.
intente archivo final localFile = File.createTempFile ("images", "jpg"); storageRef.getFile (localFile) .addOnSuccessListener (nuevo OnSuccessListener() @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Bitmap de mapa de bits = BitmapFactory.decodeFile (localFile.getAbsolutePath ()); mImageView.setImageBitmap (mapa de bits); ). addOnFailureListener (new OnFailureListener () @Override public void onFailure (@NonNull Exception exception) ); captura (IOException e)
En onSuccess ()
desde OnSuccessListener
, puedes tomar el FileDownloadTask.TaskSnapshot
objeto y recuperar el archivo, que es donde estableceremos la imagen a nuestra ImageView
.
Si solo necesitas descargar el archivo como byte[]
y no lo necesita como un archivo, que es el caso más probable cuando se carga una imagen en un archivo. ImageView
, A continuación, puede recuperar los bytes de una manera similar.
largo final ONE_MEGABYTE = 1024 * 1024; storageRef.getBytes (ONE_MEGABYTE) .addOnSuccessListener (nuevo OnSuccessListener() @Override public void onSuccess (byte [] bytes) Bitmapmapmap = BitmapFactory.decodeByteArray (bytes, 0, bytes.length); mImageView.setImageBitmap (mapa de bits); );
Puede haber situaciones en las que no necesite los datos reales para un archivo almacenado, sino que querrá la URL. Puede hacer esto de manera similar a los dos últimos ejemplos usando el getDownloadUrl ()
método en tu StorageReference
, que te dará una Uri
apuntando a la ubicación del archivo.
storageRef.getDownloadUrl (). addOnSuccessListener (nuevo OnSuccessListener() @Override public void onSuccess (Uri uri) Log.e ("Tuts +", "uri:" + uri.toString ()); // Maneja todo lo que vas a hacer con la URL aquí);
El método anterior imprimirá la URL de la imagen que cargamos manualmente anteriormente en el Monitor de Android.
E / Tuts +: uri: https://firebasestorage.googleapis.com/v0/b/tutsplus-firebase.appspot.com/o/android.jpg?alt=media&token=1828111c-78e7-4640-b418-c65e7571576a
Ahora que ya sabe cómo descargar archivos de Firebase, es hora de trabajar en las cargas. Como se vio al descargar desde Firebase Storage, los procesos para cada forma de sus datos son bastante similares. La carga no es diferente, por lo que simplemente analizaremos cómo puede mover archivos de su aplicación a Firebase Storage.
Al igual que con la descarga, deberá obtener una referencia a la FirebaseStorage
objetar y crear una referencia a la ubicación de almacenamiento de su nuevo archivo como una StorageReference
. Para este ejemplo, mostraremos ic_launcher.png en nuestro ImageView
, y luego lo subiremos como una matriz de bytes.
FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("ic_launcher.png");
A continuación, necesitaremos obtener una matriz de bytes de la imagen almacenada en la memoria a través de ImageView
. Esto se hace recuperándolo como un Mapa de bits
, comprimiéndolo en un ByteArrayOutputStream
, y luego convirtiendo eso en una byte[]
.
mImageView.setDrawingCacheEnabled (true); mImageView.measure (View.MeasureSpec.makeMeasureSpec (0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec (0, View.MeasureSpec.UNSPECIFIED)); mImageView.layout (0, 0, mImageView.getMeasuredWidth (), mImageView.getMeasuredHeight ()); mImageView.buildDrawingCache (); Bitmap bitmap = Bitmap.createBitmap (mImageView.getDrawingCache ()); ByteArrayOutputStream outputStream = new ByteArrayOutputStream (); bitmap.compress (Bitmap.CompressFormat.JPEG, 100, outputStream); byte [] data = outputStream.toByteArray ();
Finalmente, puedes crear un UploadTask
llamando putBytes (byte [])
para subir tu imagen a firebase. Esta UploadTask
También puede tener un OnSuccessListener
y OnFailureListener
asociado a ello.
UploadTask uploadTask = storageReference.putBytes (data); uploadTask.addOnFailureListener (new OnFailureListener () @Override public void onFailure (@NonNull Exception) ). addOnSuccessListener (new OnSuccessListener() @Override public void onSuccess (UploadTask.TaskSnapshot taskSnapshot) );
Cuando verifique la página de almacenamiento de la Consola Firebase, debería ver ic_launcher.png en tu lista de archivos.
Flujo de entrada
o archivoAhora que sabe cómo cargar una matriz de bytes, los otros dos tipos de cargas deben ser bastante intuitivos. Digamos que tenemos un archivo de texto llamado test.txt en nuestra carpeta de recursos en bruto. Podemos leer esto en una Flujo de entrada
y luego subirlo usando el putStream (InputStream)
método de StorageReference
.
FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("test.txt"); InputStream stream = getResources (). OpenRawResource (R.raw.test); UploadTask uploadTask = storageReference.putStream (secuencia);
Cargar un archivo existente es igual de fácil: simplemente obtenga una referencia al archivo y llame putFile (Uri)
con un URI apuntando a su archivo. Para este ejemplo, solo crearemos un archivo temporal vacío en nuestro código.
FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("test2.txt"); Archivo de archivo = nulo; intente file = File.createTempFile ("test2", "txt"); catch (IOException e) UploadTask uploadTask = storageReference.putFile (Uri.fromFile (archivo));
Si bien los archivos que hemos subido hasta ahora han sido pequeños, puede haber ocasiones en las que tengas cargas más grandes que tomarán una buena cantidad de tiempo. Firebase proporciona algunos métodos con UploadTask
eso le permitirá controlar el flujo de una carga y escuchar el progreso y los cambios de estado. Estos métodos incluyen pausa()
, currículum()
, y cancelar()
. pausa()
y currículum()
le permitirá hacer una pausa y reanudar una UploadTask
, mientras cancelar()
lo detendrá por completo. Además, puedes usar un OnPauseListener
y OnProgressListener
para realizar un seguimiento del progreso de carga y estados de pausa.
mPause = (Button) findViewById (R.id.pause); mResume = (Button) findViewById (R.id.resume); mPause.setOnClickListener (new View.OnClickListener () @Override public void onClick (vista de vista) mUploadTask.pause ();); mResume.setOnClickListener (new View.OnClickListener () @Override public void onClick (View view) mUploadTask.resume ();); FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("image.jpg"); InputStream stream = getResources (). OpenRawResource (R.raw.image); mUploadTask = storageReference.putStream (secuencia); mUploadTask.addOnPausedListener (nuevo OnPausedListener() @Override public void onPaused (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "upload paused!"); ); mUploadTask.addOnProgressListener (nuevo OnProgressListener () @Override public void onProgress (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "Bytes cargados:" + taskSnapshot.getBytesTransferred ()); );
El código anterior le permitirá controlar el proceso de carga para una imagen algo grande (1 MB, en este caso) y ver cómo cambian sus estados en el registro de Android cuando se presionan los botones de pausa y reanudar.
E / Tuts +: Bytes cargados: 524288 E / Tuts +: carga en pausa! E / Tuts +: Bytes subidos: 786432
Como cualquier desarrollador de Android puede atestiguar, a veces el ciclo de vida de la actividad de Android puede causar problemas inesperados. Una de las fuentes comunes de problemas son los oyentes que duran más que sus padres. Actividad
, que puede ser el caso para escuchas de éxito / error conectadas a una tarea de almacenamiento de Firebase.
Si una Actividad
se destruye y se vuelve a crear (como en la rotación de pantalla) mientras se está realizando una tarea, puede terminar con una Excepción de puntero nulo
cuando la tarea se ha completado. Para evitar esto, querrá guardar su StorageReference
como un Cuerda
en su estado de salida Haz
en el onSaveInstanceState (paquete)
Método, y luego recuperarlo y agregar oyentes de éxito a cada uno FileDownloadTask
o FileUploadTask
asociado con eso StorageReference
.
@Override protected void onSaveInstanceState (Bundle outState) super.onSaveInstanceState (outState); if (mStorageReference! = null) outState.putString (EXTRA_STORAGE_REFERENCE_KEY, mStorageReference.toString ()); @ Anular la anulación protegida onRestoreInstanceState (Bundle savedInstanceState) super.onRestoreInstanceState (savedInstanceState); String final StringRef = savedInstanceState.getString (EXTRA_STORAGE_REFERENCE_KEY); if (stringRef == null) return; mStorageReference = FirebaseStorage.getInstance (). getReferenceFromUrl (stringRef); Listatasks = mStorageReference.getActiveDownloadTasks (); para (FileDownloadTask tarea: tareas) task.addOnSuccessListener (este, nuevo OnSuccessListener () @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "descarga exitosa!"); );
En este tutorial, ha aprendido mucho sobre Firebase y sus opciones disponibles para el almacenamiento de archivos. Ahora debería poder cargar y descargar archivos, controlar las transferencias de datos y manejar los cambios en el ciclo de vida de la actividad de su aplicación mientras se produce una transacción..
Si bien acabamos de arañar la superficie de lo que puede hacer en Firebase, es de esperar que comprender esta herramienta le permita ampliar las capacidades de sus propias aplicaciones y brindar excelentes experiencias a sus usuarios..
Y mientras tanto, echa un vistazo a algunos de nuestros otros artículos sobre el desarrollo de Android!