Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@Takarkiz

AndroidでFirebaseStorageを使ってみよう

More than 1 year has passed since last update.

Android初心者アドベントカレンダー9日目を担当しますカーキです.
普段はLife is Tech!というところで大学生メンターをしたり、名古屋のスタートアップのスタメンという会社でモバイルアプリエンジニアインターン生として働いています.

FirebaseStorageとは

FirebaseStorageはGoogleが提供するFirebaseの機能の一つです.
FirebaseStorageではその名の通り、ファイルの送受信がいとも簡単に行うことができます.
そしてAndroidでは後述しますが画像を受け取る際にGlideという画像ローダーライブラリを使用することができます!(やったね!) :thumbsup:

準備

プロジェクト側

build.gradleにfirebase-storageを追加します.
またGlideを使ってファイルをダウンロードする際に必要になるfirebase-uiも同時に記述しておくとなお良いです.

build.gradle
implementation 'com.google.firebase:firebase-storage:19.1.0'
implementation 'com.firebaseui:firebase-ui-storage:4.3.1'

現在(2019年12月9日時点)の最新のバージョンを入力していますが、より新しいのもがあればそちらを使用してください.

Firebaseコンソール側

コンソールの方でも使用の許可をしてあげる必要があります.
vote_–_概要_–_Firebase_console.png

FirebaseStorageのページの『始める』から進めていけばFirebaseStorageのバケットを作成することができます.
また初期設定ではFirebaseCloudStoreと同様にセキュリティルールが誰でもアクセスできるという甘めの設定になっているので、リリースする前にはしっかり見直す必要があります.

ファイルをアップロードする

ファイルをアップロードするために端末内の画像のURIパスからファイルを指定してアップロードすることができます.

Firesorageのパスを作成する

画像をアップロードする際にファイルをどのようなフォルダ構成で格納するのかを示すパスを作成する必要があります.
今回は例としてUsersフォルダの配下に画像をアップロードすることとします.
フルパスが必要になるため、ファイル名は画像選択の際に取得するか任意に決めておく必要があります.

MainActivity.kt
val storage = FirebaseStorage.getInstance()
val userImageRef = storage.reference.child("Users/user001.jpg")

これでFirestorageのパスを作成することができました.

アップロードの処理

端末のギャラリーなどから選択した画像のURIをimageUriとしています.
流れとしてはUri→パス→ファイル→インプットストリーム
に変換してfirebasestorageに渡していきます

MainActivity.kt
val path = imageUri.path?: return
val stream = FileInputStream(File(path))
val uploadTask = userImageRef.putStream(stream)
uploadTask.addOnSuccessListener {
      // アップロード成功時

   }
   .addOnFailureListener { error ->
      // エラー発生時

   }

成功時と失敗時のリスナーにより、それぞれでの処理をハンドリングしていくことができます.

Glideを使ってファイルを受け取る

この場合もアップロードする場合と同様にして取得したいファイルのFirestorage上でのパスを作成する必要があります.

MainActivity.kt
val storage = FirebaseStorage.getInstance()
val userImageRef = storage.reference.child("Users/user001.jpg")

続いてGlideを使用してFirebaseStorageのパスから画像を取得していきます.
Glideは指定した画像URLから画像をImageViewに表示させるという元々の機能がありますが、
それをFirebaseStorageでもそのまま使用できることになります.

MainActivity.kt
Glide.with(this)
     .load(userImageRef)
     .into(imageView)

Glideではプレースホルダー用画像を指定することでファイルのローディング中にデフォルト画像を表示することができます.

MainActivity.kt
Glide.with(this)
     .load(userImageRef)
     .placeholder(R.drawable.ic_default_user)
     .into(imageView)

まとめ

どうだったでしょうか、
画像をアップロードする際はUriからインプットストリームを作成する必要があり、少しややこしいですがファイルのダウンロードの場合はGlideを使用することでかなり楽になりますよね.

ただGldieはもちろん画像ローダーであるため、画像以外の場合はGlideを使用してダウンロードすることはできません.
その場合はぜひ公式のドキュメントを参考にしてみてください
Android でファイルをダウンロードする

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Takarkiz
stmn-co
名古屋のITスタートアップベンチャーです。「一人でも多くの人に、感動を届け、幸せを広める。」の経営理念のもと、 エンゲージメント経営コンサルティング「TUNAG」、オンラインファンサロンアプリ「FANTS」などのサービスを展開しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?