Lors de la mise à niveau récente vers l'API 29, mon code:
downloadManager.addCompletedDownload(downloadFilename,
downloadFilename, true, saveInfo.mimeType,
downloadPath, outputFile.length(), true)
… Génère désormais un avertissement de dépréciation:
Avertissement: 'addCompletedDownload (String !, String !, Boolean, String !, String !, Long, Boolean): Long' est déconseillé. Déconseillé en Java
La documentation de l'API pour DownloadManager.addCompletedDownload indique:
Cette méthode a été déconseillée au niveau de l'API 29. Les applications doivent plutôt contribuer des fichiers à la collection MediaStore.Downloads pour les rendre disponibles à l'utilisateur dans le cadre des téléchargements.
Cependant, je n'ai pas pu trouver d'exemple de code expliquant comment utiliser exactement MediaStore.Downloads en remplacement. La documentation MediaStore.Downloads est fondamentalement inexistante et la documentation MediaStore ne fournit aucune indication évidente.
Quelqu'un peut-il fournir un remplacement conforme à l'API 29 pour le code ci-dessus?
Vous devez mettre à jour le MediaStore.Downloads
collection. De cette façon, votre fichier sera visible dans le dossier Downloads
. Dans Android Q, vous n'avez plus besoin de mettre à jour DownloadManager
mais le MediaStore.Downloads
collection.
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)
}
}
REMARQUE suivant les différences
Prenez ceci avec un grain de sel car je vérifie également les points ci-dessous:
1 - La notification n'est plus affichée. Je suppose que vous êtes maintenant responsable d'aviser l'utilisateur maintenant.
2 - MediaStore.Downloads
collection accepte uniquement les fichiers du dossier "/ Téléchargements". Cela peut donc affecter l'emplacement de téléchargement.
Pour confirmer où inséré etc., vous pouvez vider la base de données comme suit:
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");
}
}
}