Подтвердить что ты не робот

Как использовать Android DownloadManager?

Я хочу загрузить файл на SDCard с помощью класса DownloadManager Android:

Request request = new Request(Uri.parse(url));
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename); //set destination dir
long downloadId = downloader.enqueue(request);

Но я всегда получаю статус загрузки = 16 (STATUS_FAILED), а причина = 1008 (ERROR_CANNOT_RESUME). Я уже включил android.permission.WRITE_EXTERNAL_STORAGE в манифест.

Когда я прокомментировал

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename); 

и используйте папку загрузки по умолчанию, это нормально. Но я не знаю, где находится файл, localUri, который я получаю от результата, выглядит примерно так:

content://downloads/my_downloads/95

Я не знаю, как скопировать файл на SDCard.

Я хочу загрузить файл на SDCard. Может ли кто-нибудь помочь? Спасибо!

4b9b3361

Ответ 1

Вы можете получить путь к файлу из localUri следующим образом:

public static String getFilePathFromUri(Context c, Uri uri) {
    String filePath = null;
    if ("content".equals(uri.getScheme())) {
        String[] filePathColumn = { MediaColumns.DATA };
        ContentResolver contentResolver = c.getContentResolver();

        Cursor cursor = contentResolver.query(uri, filePathColumn, null,
                null, null);

        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        filePath = cursor.getString(columnIndex);
        cursor.close();
    } else if ("file".equals(uri.getScheme())) {
        filePath = new File(uri.getPath()).getAbsolutePath();
    }
    return filePath;
}

Ответ 2

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() дает мне /mnt/sdcard/downloads

И я могу использовать загруженный файл в onReceive (ACTION_DOWNLOAD_COMPLETE)

long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
Query query = new Query();
query.setFilterById(downloadId);
Cursor cur = dm.query(query);

if (cur.moveToFirst()) {
    int columnIndex = cur.getColumnIndex(DownloadManager.COLUMN_STATUS);
    if (DownloadManager.STATUS_SUCCESSFUL == cur.getInt(columnIndex)) {
        String uriString = cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));

        File mFile = new File(Uri.parse(uriString).getPath());
        ....

    } else {
        Toast.makeText(c, R.string.fail, Toast.LENGTH_SHORT).show();
    }
}