Au cours de la conférence Google I / O 2016, Firebase a été réintroduit dans la communauté des développeurs en tant qu'outil majeur pour la prise en charge rapide des pages Web et des applications mobiles. Ce tutoriel vous présentera les fonctionnalités de stockage et de récupération de fichiers disponibles pour vos applications Android..
Pour en savoir plus sur la base de données en temps réel, l'analyse, les rapports d'incidents et l'authentification de Firebase, consultez certains de nos autres didacticiels ici sur Envato Tuts.+.
Par souci de brièveté, nous ignorerons le processus de configuration générale de Firebase dans votre application Android et la console Firebase. Si vous utilisez Firebase pour la première fois dans une application, je vous suggère de consulter en premier lieu l'article de Ashraff Hathibelagal Introduction à Firebase pour Android..
Avant de pouvoir commencer à utiliser Firebase Storage, vous devez vous assurer que votre utilisateur est authentifié ou modifier les règles de configuration de l’authentification requises dans la console Firebase pour permettre aux utilisateurs non authentifiés d’accéder aux fichiers et de les télécharger. Pour garder les choses simples, nous ferons le dernier. Commençons par aller dans la section Storage de Firebase en sélectionnant Espace de rangement dans la colonne de navigation de gauche.
Ensuite, vous remarquerez qu'il y a deux onglets en haut de la Espace de rangement écran: Des dossiers et Règles.
Sélectionnez le Règles onglet, et sur la ligne autoriser la lecture, écrire: if request.auth! = null;
, changement !=
à ==
et cliquez sur le PUBLIER bouton.
Désormais, tout utilisateur de votre application devrait pouvoir télécharger des fichiers à partir de votre back-end Firebase. Bien que cela ne soit pas idéal pour un environnement de production, cela facilitera beaucoup l'apprentissage de Firebase Storage sans avoir à fouiller dans le code d'authentification..
Bien que pouvoir télécharger des fichiers depuis une application soit une bonne chose, vous voudrez parfois simplement stocker des fichiers dans un endroit facilement accessible et facilement accessible dans votre application. C'est là qu'entre en jeu le téléchargement manuel de fichiers à partir de la console Firebase. Sous le Des dossiers onglet, vous verrez un bouton bleu intitulé Téléverser un fichier.
Cliquez dessus et sélectionnez le fichier que vous souhaitez télécharger. Il apparaîtra dans votre stockage Firebase..
La sélection de ce fichier dans la console affichera une vue détaillée vous permettant d’inspecter les fichiers précédemment téléchargés..
Maintenant que vous avez un fichier stocké dans Firebase, allons-y et intégrez-le dans une application. Nous allons utiliser une mise en page simple dans notre Activité principale
qui contient un ImageView
avec un identifiant
de l'image.
Pour accéder à vos fichiers Firebase Storage, vous devez d’abord obtenir une référence à la FirebaseStorage
objet, puis créer un StorageReference
à l'URL de votre projet et au fichier que vous souhaitez télécharger. Vous pouvez trouver l'URL de votre projet en haut de l'écran. Des dossiers section de Espace de rangement dans la console Firebase.
Stockage FirebaseStorage = FirebaseStorage.getInstance (); StorageReference storageRef = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("android.jpg");
Ensuite, vous pouvez créer un Fichier
objet et essayez de charger le fichier que vous voulez en appelant getFile
sur votre StorageReference
avec le nouveau Fichier
objet passé en paramètre. Cette opération se déroulant de manière asynchrone, vous pouvez ajouter un OnSuccessListener
et OnFailureListener
à votre appel afin de gérer une éventualité.
try final File localFile = File.createTempFile ("images", "jpg"); storageRef.getFile (localFile) .addOnSuccessListener (nouveau OnSuccessListener() @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Bitmap bitmap = BitmapFactory.decodeFile (localFile.getAbsolutePath ()); mImageView.setImageBitmap (bitmap); ). addOnFailureListener (new OnFailureListener () @Override public void onFailure (@NonNull Exception exception) ); catch (IOException e)
Dans onSuccès ()
de OnSuccessListener
, vous pouvez prendre le FileDownloadTask.TaskSnapshot
objet et récupérer le fichier, qui est l'endroit où nous allons définir l'image à notre ImageView
.
Si vous devez seulement télécharger le fichier en tant que octet[]
et n'en avez pas besoin en tant que fichier, ce qui est le cas le plus probable lors du chargement d'une image dans un ImageView
, alors vous pouvez récupérer les octets de la même manière.
final long ONE_MEGABYTE = 1024 * 1024; storageRef.getBytes (ONE_MEGABYTE) .addOnSuccessListener (nouveau OnSuccessListener() @Override public void onSuccess (byte [] bytes) Bitmap bitmap = BitmapFactory.decodeByteArray (octets, 0, octets.length); mImageView.setImageBitmap (bitmap); );
Il peut arriver que vous n'ayez pas besoin des données réelles d'un fichier stocké, mais que vous souhaitiez plutôt l'URL. Vous pouvez le faire de la même manière que les deux derniers exemples en utilisant le getDownloadUrl ()
méthode sur votre StorageReference
, qui te donnera un Uri
pointant vers l'emplacement du fichier.
storageRef.getDownloadUrl (). addOnSuccessListener (nouveau OnSuccessListener() @Override public void onSuccess (Uri uri) Log.e ("Tuts +", "uri:" + uri.toString ()); // Gérez tout ce que vous allez faire avec l'URL ici);
La méthode ci-dessus imprimera l'URL de l'image que nous avons téléchargée manuellement auparavant dans Android Monitor..
E / Tuts +: uri: https://firebasestorage.googleapis.com/v0/b/tutsplus-firebase.appspot.com/o/android.jpg?alt=media&token=1828111c-78e7-4640-b418-c65e7571576a
Maintenant que vous savez télécharger des fichiers depuis Firebase, il est temps de travailler sur les téléchargements. Comme vous l'avez constaté lors du téléchargement depuis Firebase Storage, les processus de chaque forme de vos données sont assez similaires. Le téléchargement n'étant pas différent, nous allons simplement nous intéresser à la manière dont vous pouvez déplacer des fichiers de votre application vers Firebase Storage..
Comme pour le téléchargement, vous aurez besoin d’une référence à la FirebaseStorage
objet et créer une référence à l'emplacement de stockage de votre nouveau fichier en tant que StorageReference
. Pour cet exemple, nous allons montrer ic_launcher.png dans notre ImageView
, et puis nous allons télécharger cela comme un tableau d'octets.
Stockage FirebaseStorage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("ic_launcher.png");
Ensuite, nous devrons obtenir un tableau d'octets à partir de l'image stockée en mémoire via le ImageView
. Ceci est fait en le récupérant en tant que Bitmap
, le compresser dans un ByteArrayOutputStream
, puis en le transformant en un octet[]
.
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 ();
Enfin, vous pouvez créer un UploadTask
en appelant putBytes (byte [])
pour télécharger votre image sur Firebase. Ce UploadTask
peut aussi avoir un OnSuccessListener
et OnFailureListener
associé avec.
UploadTask uploadTask = storageReference.putBytes (data); uploadTask.addOnFailureListener (new OnFailureListener () @Override public void onFailure (@NonNull Exception exception) ). addOnSuccessListener (nouveau OnSuccessListener() @Override public void onSuccess (UploadTask.TaskSnapshot taskSnapshot) );
Lorsque vous consultez la page de stockage de la console Firebase, vous devriez voir ic_launcher.png dans votre liste de fichiers.
Flux d'entrée
ou fichierMaintenant que vous savez télécharger un tableau d'octets, les deux autres types de téléchargement devraient être assez intuitifs. Disons que nous avons un fichier texte nommé test.txt dans notre dossier de ressources brutes. Nous pouvons lire ceci dans un Flux d'entrée
puis téléchargez-le en utilisant le putStream (InputStream)
méthode de StorageReference
.
Stockage FirebaseStorage = 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 (flux);
Télécharger un fichier existant est tout aussi simple: il suffit d’obtenir une référence au fichier et d’appeler le putFile (Uri)
avec un URI pointant sur votre fichier. Pour cet exemple, nous allons simplement créer un fichier temporaire vide dans notre code.
Stockage FirebaseStorage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("test2.txt"); Fichier fichier = null; try file = File.createTempFile ("test2", "txt"); catch (IOException e) UploadTask uploadTask = storageReference.putFile (Uri.fromFile (fichier));
Bien que les fichiers que nous avons chargés jusqu’à présent soient de petite taille, il peut arriver que vous ayez des téléchargements plus volumineux qui prennent beaucoup de temps. Firebase fournit quelques méthodes avec UploadTask
cela vous permettra de contrôler le flux d'un téléchargement et d'écouter les progrès et les changements d'état. Ces méthodes incluent pause()
, CV()
, et Annuler()
. pause()
et CV()
vous permettra de faire une pause et de reprendre une UploadTask
, tandis que Annuler()
va complètement l'arrêter. De plus, vous pouvez utiliser un OnPauseListener
et OnProgressListener
suivre l'évolution du téléchargement et les états de pause.
mPause = (Button) findViewById (R.id.pause); mResume = (Button) findViewById (R.id.resume); mPause.setOnClickListener (new View.OnClickListener () @Override public void onClick (Affichage de la vue) mUploadTask.pause ();); mResume.setOnClickListener (new View.OnClickListener () @Override public void onClick (Affichage de la vue) mUploadTask.resume ();); Stockage FirebaseStorage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("image.jpg"); InputStream stream = getResources (). OpenRawResource (R.raw.image); mUploadTask = storageReference.putStream (stream); mUploadTask.addOnPausedListener (nouveau OnPausedListener() @Override public void onPaused (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "upload en pause!"); ); mUploadTask.addOnProgressListener (nouveau OnProgressListener () @Override public void onProgress (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "Octets téléchargés:" + taskSnapshot.getBytesTransferred ()); );
Le code ci-dessus vous permettra de contrôler le processus de téléchargement d'une image assez grande (1 Mo, dans ce cas) et de voir son état changer dans le journal Android lorsque les boutons Pause et Reprise sont enfoncés..
E / Tuts +: Octets téléchargés: 524288 E / Tuts +: upload mis en pause! E / Tuts +: Octets téléchargés: 786432
Comme tout développeur Android peut en témoigner, le cycle de vie de l'activité Android peut parfois générer des problèmes inattendus. Les auditeurs qui durent plus longtemps que leurs parents sont l’une des sources courantes de problèmes. Activité
, ce qui peut être le cas pour les écouteurs de réussite / échec attachés à une tâche de stockage Firebase.
Si un Activité
est détruit et recréé (par exemple lors de la rotation de l'écran) lorsqu'une tâche est en cours, vous pouvez vous retrouver avec un NullPointerException
lorsque la tâche est terminée. Pour éviter cela, vous voudrez sauvegarder votre StorageReference
comme un Chaîne
dans votre état extérieur Paquet
dans le onSaveInstanceState (Bundle)
méthode, puis récupérez-la et ajoutez des écouteurs de succès à chaque FileDownloadTask
ou FileUploadTask
associé à cette StorageReference
.
@Override protected void onSaveInstanceState (Bundle outState) super.onSaveInstanceState (outState); if (mStorageReference! = null) outState.putString (EXTRA_STORAGE_REFERENCE_KEY, mStorageReference.toString ()); @Override protected void onRestoreInstanceState (Ensemble saveInstanceState) super.onRestoreInstanceState (savedInstanceState); final String stringRef = savedInstanceState.getString (EXTRA_STORAGE_REFERENCE_KEY); if (stringRef == null) return; mStorageReference = FirebaseStorage.getInstance (). getReferenceFromUrl (stringRef); listetasks = mStorageReference.getActiveDownloadTasks (); for (tâche FileDownloadTask: tasks) task.addOnSuccessListener (this, nouvelle OnSuccessListener () @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "téléchargement réussi!"); );
Dans ce tutoriel, vous avez beaucoup appris sur Firebase et ses options disponibles pour le stockage de fichiers. Vous devriez maintenant être en mesure de télécharger et de télécharger des fichiers, de contrôler les transferts de données et de gérer les modifications du cycle de vie de l'activité de votre application lorsqu'une transaction est en cours..
Alors que nous venons de détailler tout ce que vous pouvez faire dans Firebase, la compréhension de cet outil vous permettra, espérons-le, d’étendre les capacités de vos propres applications et de fournir des expériences exceptionnelles à vos utilisateurs..
Et en attendant, consultez certains de nos autres articles sur le développement Android!