Android でファイルをダウンロードする

Cloud Storage を使用すると、デベロッパーは Firebase によって提供、管理される Google Cloud Storage バケットからファイルを迅速かつ容易にダウンロードできます。

参照を作成する

ファイルをダウンロードするには、まずダウンロードするファイルへの Cloud Storage 参照を作成します。

ストレージ ルートに子パスを付加することによって参照を作成することも、Cloud Storage のオブジェクトを参照する既存の gs:// または https:// URL から参照を作成することもできます。

// Create a storage reference from our app
StorageReference storageRef = storage.getReference();

// Create a reference with an initial file path and name
StorageReference pathReference = storageRef.child("images/stars.jpg");

// Create a reference to a file from a Google Cloud Storage URI
StorageReference gsReference = storage.getReferenceFromUrl("gs://bucket/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
StorageReference httpsReference = storage.getReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");

ファイルをダウンロードする

参照を作成したら、getBytes() または getStream() を呼び出して Cloud Storage からファイルをダウンロードできます。別のライブラリのファイルをダウンロードしたい場合は、getDownloadUrl() を使用してダウンロード URL を取得することができます。

メモリにダウンロードする

getBytes() メソッドを使用してファイルを byte[] にダウンロードします。これは最も簡単にファイルをダウンロードできる方法ですが、ファイルのコンテンツ全体をメモリ内に読み込む必要があります。アプリで使用できるメモリよりも大きなファイルをリクエストすると、アプリがクラッシュします。メモリの問題が発生しないように、getBytes() にダウンロードの最大バイト数を設定します。アプリで処理できる範囲内で最大サイズを設定するか、別のダウンロード方法を使用してください。

StorageReference islandRef = storageRef.child("images/island.jpg");

final long ONE_MEGABYTE = 1024 * 1024;
islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
    @Override
    public void onSuccess(byte[] bytes) {
        // Data for "images/island.jpg" is returns, use this as needed
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

ローカル ファイルにダウンロードする

getFile() メソッドはファイルをローカル端末に直接ダウンロードします。ユーザーがオフライン中にファイルにアクセスしたい場合や、別のアプリでファイルを共有したい場合は、このメソッドを使用します。getFile() から返される DownloadTask を使用して、ダウンロードの管理とダウンロード ステータスの監視を行うことができます。

islandRef = storageRef.child("images/island.jpg");

File localFile = File.createTempFile("images", "jpg");

islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
        // Local temp file has been created
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

ダウンロードを積極的に管理したい場合は、ダウンロードの管理で詳細をご覧ください。

URL によってデータをダウンロードする

URL をベースにしたダウンロード インフラストラクチャがすでにある場合や、単に URL を共有したい場合は、ストレージ参照に対して getDownloadUrl() メソッドを呼び出してファイルのダウンロード URL を取得できます。

storageRef.child("users/me/profile.png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        // Got the download URL for 'users/me/profile.png'
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

FirebaseUI によって画像をダウンロードする

FirebaseUI にはシンプルかつカスタマイズ可能で本番環境に対応したネイティブのモバイル バインドが用意されています。これにより、ボイラープレート コードをなくし、Google が提供する最良の手法を活用できます。FirebaseUI と、アプリに統合した Glide を使用して、Cloud Storage にある画像をすばやく簡単にダウンロード、キャッシュ、表示できます。

まず、FirebaseUI を app/build.gradle に追加します。

dependencies {
    // FirebaseUI Storage only
    compile 'com.firebaseui:firebase-ui-storage:0.6.0'
}

次に、ストレージから ImageView へ直接、画像を読み込みます。

// Reference to an image file in Firebase Storage
StorageReference storageReference = ...;

// ImageView in your Activity
ImageView imageView = ...;

// Load the image using Glide
Glide.with(this /* context */)
        .using(new FirebaseImageLoader())
        .load(storageReference)
        .into(imageView);

アクティビティ ライフサイクルの変更を処理する

アクティビティ ライフサイクル(ダイアログの表示や画面の回転など)が変わった後でも、ダウンロードはバックグラウンドで継続します。指定したリスナーも、指定されたまま残ります。このため、アクティビティが停止した後でリスナーが呼び出されると、予期しない結果になることがあります。

この問題を解決するには、アクティビティの範囲を指定してリスナーを登録します。こうすると、そのアクティビティが停止したときにリスナーは自動的に登録を解除されます。次に、アクティビティが再開したら getActiveDownloadTasks メソッドを使用して、実行中または最近完了したダウンロード タスクを取得します。

以下の例は、上記の手順と、使用するストレージ参照パスを保持する方法を示しています。

StorageReference mStorageRef;  //mStorageRef was previously used to transfer data.

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // If there's a download in progress, save the reference so you can query it later
    if (mStorageRef != null) {
        outState.putString("reference", mStorageRef.toString());
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    // If there was a download in progress, get its reference and create a new StorageReference
    final String stringRef = savedInstanceState.getString("reference");
    if (stringRef == null) {
        return;
    }
    mStorageRef = FirebaseStorage.getInstance().getReferenceFromUrl(stringRef);

    // Find all DownloadTasks under this StorageReference (in this example, there should be one)
    List<FileDownloadTask> tasks = mStorageRef.getActiveDownloadTasks();
    if (tasks.size() > 0) {
        // Get the task monitoring the download
        FileDownloadTask task = tasks.get(0);

        // Add new listeners to the task using an Activity scope
        task.addOnSuccessListener(this, new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
          @Override
          public void onSuccess(FileDownloadTask.TaskSnapshot state) {
             handleSuccess(state); //call a user defined function to handle the event.
          }
        });
    }
}

エラーを処理する

ダウンロード時にエラーが発生する理由として、ファイルが存在しない、目的のファイルのアクセス権がユーザーにないなど、たくさんの理由が考えられます。エラーについて詳しくは、このドキュメントのエラーの処理のセクションをご覧ください。

ダウンロードとエラー処理の完全な例を以下に示します。

storageRef.child("users/me/profile.png").getBytes(Long.MAX_VALUE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
    @Override
    public void onSuccess(byte[] bytes) {
        // Use the bytes to display the image
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

Cloud Storage に保存されているファイルのメタデータを取得して更新することもできます。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。