最近API 29にアップグレードすると、私のコード:
downloadManager.addCompletedDownload(downloadFilename,
downloadFilename, true, saveInfo.mimeType,
downloadPath, outputFile.length(), true)
…非推奨の警告が表示されるようになりました:
警告:「addCompletedDownload(String !, String !, Boolean、String !, String !, Long、Boolean):Long」は非推奨になりました。 Javaで非推奨
DownloadManager.addCompletedDownloadのAPIドキュメントには、次のように記載されています。
このメソッドはAPIレベル29で廃止されました。アプリは代わりにMediaStore.Downloadsコレクションにファイルを提供して、ダウンロードの一部としてユーザーが利用できるようにする必要があります。
ただし、MediaStore.Downloadsを代わりに使用する方法のコード例を見つけることができませんでした。 MediaStore.Downloads のドキュメントは基本的に存在せず、 MediaStore のドキュメントは明確なガイダンスを提供しません。
誰でも上記のコードのAPI 29準拠の代替品を提供できますか?
MediaStore.Downloads
コレクションを更新する必要があります。これにより、ファイルがDownloads
フォルダーに表示されます。 Android Qでは、DownloadManager
ではなくMediaStore.Downloads
コレクションを更新する必要がなくなりました。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// You can add more columns.. Complete list of columns can be found at
// https://developer.Android.com/reference/Android/provider/MediaStore.Downloads
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Downloads.TITLE, /* FILE_NAME */);
contentValues.put(MediaStore.Downloads.DISPLAY_NAME, /* DISPLAY NAME */);
contentValues.put(MediaStore.Downloads.MIME_TYPE, /* MIME TYPE */);
contentValues.put(MediaStore.Downloads.SIZE, /* FILE SIZE */);
// If you downloaded to a specific folder inside "Downloads" folder
contentValues.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS + File.separator + "Temp");
// Insert into the database
ContentResolver database = getContentResolver();
database.insert(Downloads.EXTERNAL_CONTENT_URI, contentValues);
} else {
DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
if (downloadManager != null) {
downloadManager.addCompletedDownload(downloadFilename, downloadFilename, true,
saveInfo.mimeType, downloadPath, outputFile.length(), true)
}
}
次の違いに注意してください
私はまだ以下の点もチェックしているので、これは塩の粒であると考えてください:
1-通知は表示されなくなります。あなたは今、ユーザーに通知する責任があると思います。
2-MediaStore.Downloads
コレクションは、「/ Downloads」フォルダの下のファイルのみを受け入れます。そのため、これはダウンロード場所に影響を与える可能性があります。
挿入場所などを確認するには、次のようにデータベースをダンプします。
public void dumpDb() {
DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
if (downloadManager != null) {
Cursor cursor = downloadManager.query(new DownloadManager.Query());
Log.e("TESTS", "DownloadManager dump start");
while(cursor.moveToNext()) {
Log.e("TESTS", "Title: " + cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE))
+ " status: " + cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))
+ " id: " + cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_ID)));
}
Log.e("TESTS", "DownloadManager dump end");
cursor.close();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ContentResolver contentResolver = getContentResolver();
if (contentResolver != null) {
Cursor cursor = contentResolver.query(Downloads.EXTERNAL_CONTENT_URI, null, null, null);
Log.e("TESTS", "MediaStore Collection Dump start");
if (cursor != null) {
Log.e("TESTS", DatabaseUtils.dumpCursorToString(cursor));
cursor.close();
}
Log.e("TESTS", "MediaStore Collection Dump end");
}
}
}