継続ダウンロードとダウンロード情報の保存
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によるダウンロード情報の永続化が有効です。