Получить путь к файлу из перехваченного намерения 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.

Ответы на вопрос(3)

Ваш ответ на вопрос