Recuperar la ruta del archivo del intento de DownloadManager capturado

Desde Android 4.2, si un usuario descarga algún archivo en el navegador, se usa el DownloadManager. Si el usuario hace clic en la notificación de 'descarga completa', se produce un intento y siempre se inició. Antes de Android 4.2, la intención solía tener la ruta del archivo descargado en el contenido, de manera que:

intent.getData()

devolvería una cadena comofile:///storage/emulated/0/Download/some_file.ext. Sin embargo, desde Android 4.2, el gestor de descargas emite e intenta con unacontent esquema, comocontent://downloads/all_downloads/2334.

¿Cómo recupero la ruta del archivo local para un archivo descargado?

He intentado lo siguiente:

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

Pero el cursor nunca devuelve ninguna fila (así queq.getCount() == 0 y por lo tanto el últimoreturn sentencia lanza una excepción). Además, el truco analizando la id del archivo de descarga del Uri parece extraño.

ACTUALIZAR: También he intentado:

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

pero esto devuelve un error indicando

Denegación de permiso: lectura de com.android.providers.downloads.DownloadProvider contenido uri: // downloads / all_downloads / 2334 de pid = 30950, uid = 10064 requiere android.permission.ACCESS_ALL_DOWNLOADS, o grantUriPermission ()

Claramente no puedo acceder a las descargas (ya que mi aplicación no las inició, el navegador sí lo hizo) a través deContentProvider.

Respuestas a la pregunta(3)

Su respuesta a la pregunta