8

さて、ファイル(画像)をダウンロードしています。ダウンロードが完了したら、画像のローカル URI を含むメッセージを送信したいと考えています。しかし、20% の確率で次のようになります。

6-01 18:46:39.900: INFO/DownloadManager(412): Initiating request for download 605
06-01 18:46:39.910: WARN/DownloadManager(412): Aborting request for download 605: Trying to resume a download that can't be resumed
06-01 18:46:39.910: INFO/ololo(2826): Okay, I'll broadcast.
06-01 18:46:39.990: WARN/ImageView(2826): Unable to open content: content://downloads/my_downloads/605
    java.io.FileNotFoundException: No filename found.
    at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:145)...
06-01 18:46:39.990: INFO/System.out(2826): resolveUri failed on bad bitmap uri: content://downloads/my_downloads/605
06-01 18:46:39.990: INFO/ololo(2826): content://downloads/my_downloads/605 was set for android.widget.ImageView@408a2cf0

ここにコードがあります

Long downloadId = downloadIds.get(this);

if(downloadId == intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)) {
    DownloadManager.Query query = new DownloadManager.Query();
    query.setFilterById(downloadId);
    Cursor cursor = downloadManager.query(query);

    if(cursor.moveToFirst()) {

        switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))) {
            case DownloadManager.STATUS_SUCCESSFUL : {
                Log.i("ololo", "Okay, I'll broadcast.");
                // Broadcasting
                break;
            }
            case DownloadManager.STATUS_FAILED : {
                Log.i("ololo", "Bad, I won't broadcast.");
                int reason = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON));
                if(reason == DownloadManager.ERROR_CANNOT_RESUME || reason == DownloadManager.ERROR_UNKNOWN) {
                    // Rerun download
                }
                break;
            }
            default:
                break;
        }
    }
}
4

1 に答える 1

8

DownloadManager にはバグがあり、正しく動作しません。このバグは、しばらく前に Google に提出されました。

https://code.google.com/p/android/issues/detail?id=18462

単一ファイルのダウンロードの場合、この目的のためにダウンロードする一意のディレクトリを指定することでこれを回避でき、DownloadManager.STATUS_SUCCESSFUL でそのディレクトリにあるものをすべて取得します。
複数ファイルのダウンロードの場合、ソースでファイルの名前を変更できない限り、現時点では回避策を思いつきません。

于 2013-03-02T01:53:22.397 に答える