Androidにおけるダウンロード情報の保存と継続ダウンロード機能の実装

継続ダウンロードとダウンロード情報の保存

Androidアプリケーションの開発において、ファイルのダウンロード機能は一般的な要件の一つです。しかし、ネットワークの不安定や端末の状態などにより、ダウンロードが中断されることがあります。このような場合でも、以前のダウンロード状況から再開できる「継続ダウンロード(リジュームダウンロード)」機能を実装することが求められます。 この機能を実現するには、ダウンロード途中の状況を保存しておく必要があります。本記事では、Androidで継続ダウンロードを実装する方法と、ダウンロード情報を保存する技術について解説します。

継続ダウンロードの実装

継続ダウンロードの鍵となるのは、HTTPリクエストにRangeヘッダーを設定し、ダウンロード済みの部分以降から再開する仕組みです。以下のコード例は、OkHttpライブラリを使用してこの処理を行う方法を示しています。

private void resumeDownload() {
    String targetUrl = "https://example.com/samplefile.zip";
    String destinationPath = getApplicationContext().getFilesDir() + "/samplefile.zip";

    File storedFile = new File(destinationPath);
    long existingFileSize = storedFile.exists() ? storedFile.length() : 0;

    OkHttpClient httpClient = new OkHttpClient();
    Request request = new Request.Builder()
        .url(targetUrl)
        .header("Range", "bytes=" + existingFileSize + "-")
        .build();

    Call downloadCall = httpClient.newCall(request);
    downloadCall.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            // ダウンロード失敗時の処理
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful()) {
                BufferedSink fileSink = Okio.buffer(Okio.sink(new File(destinationPath)));
                fileSink.writeAll(response.body().source());
                fileSink.close();
            }
        }
    });
}
このコードでは、既にダウンロード済みのファイルのサイズを取得し、その位置からダウンロードを再開するようにRangeヘッダーを設定しています。

ダウンロード情報の保存

ダウンロードの進行状況を保存するには、SharedPreferencesやSQLiteなどの永続化手段が利用可能です。以下は、SharedPreferencesを使用してダウンロード済みのサイズを保存・取得する例です。

private void saveDownloadProgress(long size) {
    SharedPreferences preferences = getSharedPreferences("download_status", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putLong("downloaded_bytes", size);
    editor.apply();
}

private long loadDownloadProgress() {
    SharedPreferences preferences = getSharedPreferences("download_status", Context.MODE_PRIVATE);
    return preferences.getLong("downloaded_bytes", 0);
}
この例では、ダウンロード中にsaveDownloadProgressメソッドを呼び出して現在のサイズを保存し、次回ダウンロード時にloadDownloadProgressメソッドで値を取得します。 以上のように、Androidで継続ダウンロードを実装するには、Rangeヘッダーによるダウンロード位置の指定と、SharedPreferencesによるダウンロード情報の永続化が有効です。

タグ: Android OkHttp SharedPreferences HTTP Range ファイルダウンロード

5月15日 03:11 投稿