Firebase Storage にアプリからアクセスする

0

Firebase Storage に、Android アプリからアクセスする方法について書いてみたいと思います。

Firebase Storage は、オンラインのストレージ機能です。

無料の料金プランでも、5GB までのファイル容量が与えられています。

以前に書いた記事では、Firestore データベースのバックアップファイルの

格納場所としての利用方法を紹介しましたが、

今度はアプリから、Firebase Storage を使ってみようと思います。

公式のドキュメントはコチラになります。

まず、アプリレベルの build.gradle に以下の依存関係を追加します。

(バージョンは、最新の値に書き換えて下さい。)

implementation 'com.google.firebase:firebase-storage:19.1.0'

ストレージの特定のファイルへの参照は、以下のように取得します。

予め、Firebase Console を使って、フォルダとファイルを作成しておきます。

FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageRef = storage.getReference();

StorageReference hogeRef = storageRef.child("hoge");
StorageReference imageRef = hogeRef.child("test.png");

Log.d(TAG, "getPath : " + imageRef.getPath());
Log.d(TAG, "getName : " + imageRef.getName());
Log.d(TAG, "getBucket : " + imageRef.getBucket());

StorageReference のメソッドを使うことで、ファイルツリーを辿ることができます。

また、パスやバケット名などの情報を取得することができます。

ファイルのメタ情報については、以下のように取得します。

通信をはさむため、コールバック方式の処理になっています。


imageRef.getMetadata().addOnCompleteListener(new OnCompleteListener<StorageMetadata>() {
  @Override
  public void onComplete(@NonNull Task<StorageMetadata> task) {
    if (task.isSuccessful()) {
      StorageMetadata metadata = task.getResult();
      Log.d(TAG, "getMetadata success");
      Log.d(TAG, "metadata.getName : " + metadata.getName());
      Log.d(TAG, "metadata.getSizeBytes : " + metadata.getSizeBytes());
      Log.d(TAG, "metadata.getCreationTimeMillis : " + metadata.getCreationTimeMillis());
      Log.d(TAG, "metadata.getContentType : " + metadata.getContentType());
      Log.d(TAG, "metadata.getMd5Hash : " + metadata.getMd5Hash());
    } else {
      Log.d(TAG, "getMetadata failure", task.getException());
    }
  }
});

これにより、ファイルサイズなどのメタ情報が取得できます。

メタ情報の書き換えについては割愛しますが、任意のキーバリュー値 (カスタムメタ情報) を格納することもできます。

(ただし、公式のドキュメントには、アプリ固有の情報は、カスタムメタ情報に格納するよりも、データベースを使う方が良いと書かれています。)

ファイルをアップロードするには、例えば以下のようにします。

実験のために予め、アプリ内にファイルを用意しておきます。

try {
  final InputStream stream = new FileInputStream(new File(getApplicationContext().getFilesDir(), "test.png"));

  StorageReference uploadRef = hogeRef.child("upload.png");

  UploadTask uploadTask = uploadRef.putStream(stream);
  uploadTask.addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
      try { stream.close(); }
      catch (IOException e) {}

      if (task.isSuccessful()) {
        Log.d(TAG, "putStream success");
      } else {
        Log.d(TAG, "putStream failure", task.getException());
      }
    }
  });
} catch (FileNotFoundException e) {
}

この例では、ファイルからストリームを作り、それを用いてアップロードしています。

それ以外にも、メモリ内のデータをアップロードするメソッドなどが用意されています。

0
タイトルとURLをコピーしました