Как использовать 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. Может ли кто-нибудь помочь? Спасибо!
Ответы
Ответ 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();
}
}