Получить путь к файлу из перехваченного намерения DownloadManager
Начиная с Android 4.2, если пользователь загружает какой-либо файл в браузере, используется DownloadManager. Если пользователь щелкает уведомление «загрузка завершена», намерение запускается и всегда запускается. До Android 4.2 намерение использовало путь к загруженному файлу в контенте, например:
intent.getData()
вернет строку, такую какfile:///storage/emulated/0/Download/some_file.ext
, Однако, начиная с Android 4.2, менеджер загрузок вещает и намереваетсяcontent
схема, такая какcontent://downloads/all_downloads/2334
.
Как получить локальный путь к файлу для загруженного файла?
Я пробовал следующее:
public static String getRealPathFromURI(Uri contentUri, Activity activity) {
DownloadManager downloadManager = (DownloadManager) activity.getSystemService(Activity.DOWNLOAD_SERVICE);
String[] contentParts = contentUri.getEncodedPath().split("/");
Cursor q = downloadManager.query(new DownloadManager.Query().setFilterById(Integer.parseInt(contentParts[contentParts.length - 1])));
if (q == null) {
// Download no longer exists
return null;
}
q.moveToFirst();
return q.getString(q.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
}
Но курсор никогда не возвращает никаких строк (такq.getCount() == 0
и поэтому последнийreturn
заявление выдает исключение). Кроме того, взлом парсинга идентификатора загружаемого файла из Uri кажется странным.
ОБНОВИТЬ: Я также попробовал:
input = getActivity().getContentResolver().openInputStream(contentUri);
но это возвращает сообщение об ошибке
Отказ в разрешении: чтение com.android.providers.downloads.DownloadProvider uri content: // downloads / all_downloads / 2334 из pid = 30950, uid = 10064 требует android.permission.ACCESS_ALL_DOWNLOADS или grantUriPermission ()
Очевидно, что я не могу получить доступ к загрузкам (так как мое приложение не инициировало их - это сделал браузер) черезContentProvider
.