Firebase pour Android Stockage de fichiers

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

Configuration de l'authentification

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

Téléchargement manuel de fichiers

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

Téléchargement de fichiers depuis une application Android

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.

Téléchargement de fichiers sous forme de tableau d'octets

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

Obtenir l'URL d'un fichier

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

Téléchargement depuis une application Android

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

Chargement d'un tableau d'octets

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.

Téléchargement depuis un Flux d'entrée ou fichier

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

Contrôle des téléchargements et utilisation des rappels

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

Gestion du cycle de vie de l'activité Android

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); liste tasks = 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!"); ); 

Conclusion

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!

  • Commencer à créer une application de conception de matériaux

    Dans cette vidéo de mon cours sur la création d'une application de conception de matériaux, vous apprendrez à créer l'interface utilisateur d'une application de conception de matériaux. Vous allez apprendre à…
    Ashraff Hathibelagal
    Android
  • Audio de fond dans Android avec MediaSessionCompat

    L'une des utilisations les plus courantes pour les appareils mobiles est la lecture audio via des services de diffusion de musique en continu, des podcasts téléchargés, etc.
    Paul Trebilcox-Ruiz
    SDK Android
  • Comment démarrer avec un modèle d'application Android

    CodeCanyon propose des centaines de modèles d’applications Android que vous pouvez utiliser pour lancer rapidement le développement de votre prochaine application. Dans ce tutoriel, je vais vous aider à démarrer…
    Ashraff Hathibelagal
    Android
  • Quoi de neuf dans Android Studio 2.2?

    Les derniers mois ont été une période passionnante pour Android Studio. Il y a eu d'abord la version 2.1 prenant en charge Android N. Ensuite, Google I / O nous a présenté un aperçu de…
    Jessica Thornsby
    Android