Так как Android 4.2, если пользователь загружает какой-либо файл в браузере, используется DownloadManager. Если пользователь нажимает на уведомление "загрузить полный", Intent всегда и всегда запускается. Перед 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
.