AndroidでFirebaseのStorageを使う

#初めに
Androidアプリ開発で、サーバーで定期処理したデータをクラウドに上げてAndroidアプリで取り込むことをしたかったのでやってみました。今回はKotlinで記述しています。

#Firebaseとは？
Firebaseとは、Googleが提供しているクラウドサービスです。利用できるプラットフォームが多岐にわたっていて、機能も豊富です。
##利用できるプラットフォーム
* __Andorid__
* __IOS__
* __Web__
* __デスクトッププログラム__...etc

##主な機能
* ユーザ認証
* データベース
* __ストレージ__
* ホスティング
* クラウドファンクション
* 機械学習キット
* アナイティクス
* メッセージング
* プレディクション

非常に様々な機能がありますが、今回はこの中でシンプルな機能を持つストレージを扱います。
#Storageの機能
一般的なアプリ開発をする場合、テキストデータファイルや画像ファイル、xmlファイル、JSONファイルなど
これらのファイルは予めプロジェクトに組み込まれたうえで開発すると思います。
しかし、この場合「ファイルデータだけ更新する」という作業が非常に面倒に感じることでしょう。
ファイルの更新のたびにアプリをアップデートする必要がありますから。。。

クラウド環境にファイルを設置して必要に応じて読み込むことが出来ればそれだけでかなりに楽になるでしょう。
__この「ファイルを保管するストレージをクラウドに用意する」機能がFirebaseのStorageです。__
便利だ―。
#手順
##1.Firebaseのプロジェクトを作成する
まず始めにFirebaseサイトでログインした後、Firebaseのコンソールページに移動して新規プロジェクトを作成します。
名前の設定以外特別指定する必要はありません。

<dl>※今回のアプリでは、<dt>AndroidStudio上で作るAndroidのプロジェクト</dt>
  <dt>Firebase上で作るFirebaseの様々な設定をするFirebaseのプロジェクト</dt>
この二つのプロジェクトを作成しています。</dl>
##2.AndroidStudioでFirebaseに接続する
Firebaseを利用したいAndroidのプロジェクトを開き、メニューのToolsからFirebaseを選択すると
Firebaseに関するウィンドウが出てくるので__Storage__を選択して、
Connect to Firebase　を押してFirebaseと接続します。
※ウィンドウは右のAssistantをクリックして開閉できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377692/8facbf91-6daa-d51c-65ca-c475c6a8a5b8.png)
##3.Firebase側でAndroidアプリを登録する
Firebaseのコンソール左上にあるProjectOverViewをクリックすると、画面にアプリを追加しましょうという内容が出てくるので
アプリを追加するをクリックし、プラットフォームをAndroidと選択します。
AndroidアプリにFirebaseを追加　という設定画面に移るのでここで
Androidのパッケージ名を入力します。
パッケージ名は自分のktファイルなどで書かれている
package com.〇〇～
の__com.〇〇～__の箇所を丸々コピペしましょう。

ここの画面でアプリを登録を押した際、エラーのような表示が出ることがありますが
登録自体はできているので画面をリロードして、
もう一度ProjectOverView→アプリの追加を見ると自分のアプリが出てくるのでそこを押すと
SDKの設定を続ける　というボタンから現在の設定の続きが行えます。

次に、設定ファイルのダウンロードとありますが、この「google-service.json」というファイルは
AndroidStudioで自動で追加されるのでしなくて大丈夫です。
ディレクトリを参照してファイルが無い場合はAndroidプロジェクトの__appフォルダ__の直下に入れてください。

ここまではFirebaseでStorage以外の機能を使うときと変わりません。
##4.AndroidStudio側でbuilde.gradleを修正する
AndroidStudioで先程の__Connect to Firebase__の下の
__Add Cloud Storage to your app__を選択します
すると__builde.gradle__を修正するという確認画面が入るのでOKを押すことで、
__builde.gradle__ファイルにFirebasのStorageを利用するための内容が追加されます。

__ここでmake projectをしてみて何らかのエラーが発生した場合__


```project/app/build.gradle
dependencies {
    implementation 'com.google.firebase:firebase-core:16.0.8'
}
```
このcom.google.firebase:firebase-coreの部分のバージョンを書き換えてみてください
私の場合ここが17.0.0になっていてエラーの原因になっていました。

##5.Firebase側のStorageにダウンロードしたいファイルをアップしておく
Firebaseのコンソールページを開き、Storageをクリックします。
メニューのファイルを選択するとファイルをアップロードできるので自分の使いたいファイルをアップロードして下さい。
テキストファイルの場合はUTF-8にしておくといいです。
##6.Firebase側でStorageのセキュリティの設定を行う
次に、ルールの設定を行います。
メニューでルールを選択するとセキュリティの設定画面になるので
ここで

```
service firebase.storage {
  match /b/{bucket}/o {
    match /public/{allPaths=**} {
      allow read, write;
    }
  }
}
```
と記述して、誰でもアクセス出来るよう設定します。
これで設定は完了しました。
次にAndroidアプリでクラウドにアップロードされたファイルを読み込んでみます。

7.Storageにあるファイルを読み込む
ここまでで、FirebaseをAndroidに組み込み設定が完了したので
FirebaseのStorageにあるテキストファイルを読み込んでみたいと思います。
下記のソースコードでは、読み込んだデータを
適当なEditTextにセットしてあげて画面に表示しています。

```kotlin
package com.example.firebasetest2
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.google.firebase.storage.FirebaseStorage
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.d("Test","1")
        val storage = FirebaseStorage.getInstance()
        val storageRef = storage.reference
        val dir = storageRef.child("ファイル名")
        Log.d("Test","2")
        val byteLength=1024*1024L
        dir.getBytes(byteLength).addOnSuccessListener{
            bytes ->
                Log.d("Test","3")
                val data = String(bytes, Charsets.UTF_8)
                val array=data.split("/n")
                var res=""
                val i=1;
            Log.d("Test","4")
                for(item in array){
                    res=i.toString().plus(item).plus("\n")
                }
                test.text=res
        }.addOnFailureListener {  }
    }
}

```

#最後に
FirebaseをAndroidに組み込む上で何をしたらいいか、ってことが公式のドキュメントを読むだけでは難解だったためかなり苦戦しました。しかし、一度組み込むことが出来たらかなり自由度が上がり便利なものであることを感じました。
もっと日本語の情報が増えてくれれば楽になるのだけど...