


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) {
}
この例では、ファイルからストリームを作り、それを用いてアップロードしています。
それ以外にも、メモリ内のデータをアップロードするメソッドなどが用意されています。