Recuperar o caminho do arquivo da intenção do DownloadManager capturado

Desde o Android 4.2, se um usuário faz o download de algum arquivo no navegador, o DownloadManager é usado. Se o usuário clicar na notificação 'download complete', o Intent é e sempre foi lançado. Antes do Android 4.2, a intenção costumava ter o caminho do arquivo baixado no conteúdo, de tal forma que:

intent.getData()

retornaria uma String comofile:///storage/emulated/0/Download/some_file.ext. No entanto, desde o Android 4.2, o gerenciador de download transmite e tenta com umcontent esquema, comocontent://downloads/all_downloads/2334.

Como faço para recuperar o caminho do arquivo local para um arquivo baixado?

Eu tentei o seguinte:

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));
}

Mas o cursor nunca retorna nenhuma linha (entãoq.getCount() == 0 e, portanto, o últimoreturn instrução lança uma exceção). Além disso, o hack, analisando o id do arquivo de download do Uri, parece estranho.

ATUALIZAR: Eu também tentei:

input = getActivity().getContentResolver().openInputStream(contentUri);

mas isso retorna um erro afirmando

Negação de permissão: lendo com.android.providers.downloads.DownloadProvider uri content: // downloads / all_downloads / 2334 de pid = 30950, uid = 10064 requer android.permission.ACCESS_ALL_DOWNLOADS ou grantUriPermission ()

É claro que não consigo acessar os downloads (como meu aplicativo não os iniciou - o navegador fez) através doContentProvider.

questionAnswers(3)

yourAnswerToTheQuestion