web-dev-qa-db-ja.com

DownloadManager.addCompletedDownload()は非推奨Android Q

最近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準拠の代替品を提供できますか?

11
Stephen Talley

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