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
.