Firebase para Android almacenamiento de archivos

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+.

Configuración de autenticación

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..

Subir archivos manualmente

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..

Descarga de archivos desde una aplicación de Android

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.

Descarga de archivos como una matriz de bytes

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); );

Obtener la URL de un archivo

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

Cargando desde una aplicación de Android

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.

Subir una matriz de bytes

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.

Subiendo desde un Flujo de entrada o archivo

Ahora 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));

Control de subidas y uso de devoluciones de llamada

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

Manejo del ciclo de vida de la actividad de Android

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); Lista tasks = mStorageReference.getActiveDownloadTasks (); para (FileDownloadTask tarea: tareas) task.addOnSuccessListener (este, nuevo OnSuccessListener() @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "descarga exitosa!"); ); 

Conclusión

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!

  • Empezar a construir una aplicación de diseño de materiales

    En este video de mi curso sobre la construcción de una aplicación de diseño de materiales, aprenderá cómo crear la interfaz de usuario de una aplicación de diseño de materiales. Aprenderás cómo ...
    Ashraff Hathibelagal
    Androide
  • Fondo de audio en Android con MediaSessionCompat

    Uno de los usos más populares para dispositivos móviles es la reproducción de audio a través de servicios de transmisión de música, podcasts descargados o cualquier otro número de audio ...
    Paul Trebilcox-Ruiz
    SDK de Android
  • Cómo empezar con una plantilla de aplicación de Android

    CodeCanyon tiene cientos de plantillas de aplicaciones de Android que puede utilizar para impulsar el desarrollo de su próxima aplicación. En este tutorial, te ayudaré a comenzar ...
    Ashraff Hathibelagal
    Androide
  • Lo nuevo en Android Studio 2.2?

    Los últimos meses han sido un momento emocionante para Android Studio. Primero llegó la versión 2.1 con soporte para Android N. Luego, Google I / O nos trajo una vista previa de ...
    Jessica thornsby
    Androide