2
1

More than 3 years have passed since last update.

AndroidのオープンソースファイルダウンロードマネージャーFetch使ってみた

Last updated at Posted at 2020-05-12

今回の記事について

今回は、自分の開発しているアプリに実装します!
DownloadManagerを使おうかなーと思って調べていたところ、発見しよさそうだなと思ったので、使いたいと思います!
調べてみたら、日本語の情報が少なく、情報を共有出来たらと思い、書きます!
私も初めて使うので、間違えがあったら教えてください!
GitHubのページはこちら

今回の環境

今回の場合は、ファイルはFirebase CLoudStrageに保存されており、DownloadURLを取得し、そのURLを使用してダウンロードすることにします。
なお、FirebaseCloudStrageの使い方は、省略します。

準備

まずは、applicationフォルダ内のbuild.gradleに依存関係を追加します。
今回は、AndroidXで使用するので、

implementation "androidx.tonyodev.fetch2:xfetch2:3.1.4"

を追加します。
追加したら、syncします。

Acticvityの作成

今回は、DownloadActivityとして作成しました。
レイアウトは、ボタンとprogressbarだけの簡単なレイアウトです。
image.png

CloudStrageのDownloadURLの取得

Download用のURLを取得します。
今回のCloudStrageの場合は、セキュリティルールで認証済みの人のみに設定しているので、FirebaseAuthでログイン状態を確認します。
今回は、onCreateの中で実行し、ログインしている場合のみボタンを有効かするように設定します。
また、ユーザーがnullじゃない場合は、Strageの参照を取得するようにします。
実際の環境で使用する場合は、もう少し丁寧に行ってください。
onClickListnerも設定します。


Button downloadButton = findViewById(R.id.downloadbutton);
ProgressBar progressBar = findViewById(R.id.progressBar);

downloadButton.setOnClickListener(onClickListener);
if(FirebaseAuth.getInstance().getCurrentUser() == null) {
   downloadButton.setEnabled(false);
   }else {
    firebaseStorage = FirebaseStorage.getInstance();
    storageReference = firebaseStorage.getReference().child("FirebaseStrage上のパス");
   }

View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    };

onClickの中に処理を書いていきます。
まずは、ボタンが押されたら、ダウンロード用のURLを取得します。

storageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                }
            });

取得に成功すると、uriでダウンロード用URLが帰ってきます。

ダウンロード処理

Fetchのインスタンスを生成します。
今回は、onCreateで生成しましたが、状況に合わせてください。
setDownloadCurrentLimitには、同時ダウンロード数を設定します。

 FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this)
                    .setDownloadConcurrentLimit(2)
                    .build();
            fetch = Fetch.Impl.getInstance(fetchConfiguration);

次に、ダウンロードリクエストを生成します。
これは、onClickリスナーの中で処理します。
uriは先ほど取得したダウンロードurl
filePathには、端末の保存先をStringで指定します。

downloadRequest = new Request(uri.toString(),filePath );

リスナ-を生成します。
本番で使用する際は、もう少しちゃんと処理を書きましょう。


FetchListener fetchListener = new FetchListener() {
        @Override
        public void onWaitingNetwork(@NotNull Download download) {
        downloadStatusTextView.setText("ネットワーク接続待機中");
        }

        @Override
        public void onStarted(@NotNull Download download, @NotNull List<? extends DownloadBlock> list, int i) {
        downloadStatusTextView.setText("ダウンロード中");
        }

        @Override
        public void onError(@NotNull Download download, @NotNull Error error, @Nullable Throwable throwable) {
        downloadStatusTextView.setText("ダウンロードエラー");
        }

        @Override
        public void onDownloadBlockUpdated(@NotNull Download download, @NotNull DownloadBlock downloadBlock, int i) {
        }

        @Override
        public void onAdded(@NotNull Download download) {
        }

        @Override
        public void onQueued(@NotNull Download download, boolean waitingOnNetwork) {
        }

        @Override
        public void onCompleted(@NotNull Download download) {
        downloadStatusTextView.setText("ダウンロード完了");
        }

        @Override
        public void onProgress(@NotNull Download download, long etaInMilliSeconds, long downloadedBytesPerSecond) {
            int progress = download.getProgress();
            progressBar.setProgress(progress);
        }

        @Override
        public void onPaused(@NotNull Download download) {
        }

        @Override
        public void onResumed(@NotNull Download download) {
        }

        @Override
        public void onCancelled(@NotNull Download download) {
        }

        @Override
        public void onRemoved(@NotNull Download download) {
        }

        @Override
        public void onDeleted(@NotNull Download download) {
        }
    };

リスナーを設定します。


        fetch.addListener(fetchListener);

ダウンロードを開始します。

        fetch.enqueue(downloadRequest, updatedRequest -> {
        }, error -> {
        });

ダウンロードが完了すると、リスナーのonCompletedが呼び出されます。
複数のダウンロードをしている場合は、

download.getId()

でダウンロードIDが取得できます。

ダウンロードの中断等も簡単に出来ます。

//一時停止
fetch.pause(downloadrequest.getId());
//キャンセル
fetch.cancel(downloadrequest.getId());

また、Wifiの時のみダウンロードすることなども出来ます。

//すべてのタイプ
downloadRequest.setNetworkType(NetworkType.ALL);
//Wifiのみ
downloadRequest.setNetworkType(NetworkType.WIFI_ONLY);

ほかには、グループとしてダウンロードをまとめて管理したりすることができるようです。

まとめ

少し雑な記事になってしまいましたが、これはとても便利ですね!
しかし、ダウンロード先にすでにファイルが存在する場合、ダウンロードされないけど、onCompleteになるようです。
私は、ダウンロードファイル名を変更することで対応しましたが、どうすれば良いのか、、
上書きオプションは無いようです。
もしご存じの方がいれば、教えてください!
ではではー

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1