web-dev-qa-db-fra.com

DownloadManager.addCompletedDownload () déconseillé sur Android Q

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?

11
Stephen Talley

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");
        }
    }
}
6
W0rmH0le