Poiché Android 4.2 se un utente scarica alcuni file nel browser, viene utilizzato DownloadManager. Se l'utente fa clic sulla notifica di "download completo", l'intento è sempre stato lanciato. Prima di Android 4.2 l'intento usato per avere il percorso del file scaricato nel contenuto, in modo tale che:Recupera il percorso del file dall'intento di DownloadManager catturato
intent.getData()
sarebbe restituire una stringa come file:///storage/emulated/0/Download/some_file.ext
. Tuttavia, poiché Android 4.2 il gestore di download trasmette e intenti con uno schema content
, ad esempio content://downloads/all_downloads/2334
.
Come si recupera il percorso del file locale per un file scaricato?
ho provato la seguente:
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));
}
ma il cursore non restituisce tutte le righe (così q.getCount() == 0
e per questo l'ultima return
dichiarazione genera un'eccezione). Inoltre, l'hack analizzando l'ID del file di download dall'URI sembra strano.
UPDATE: Ho anche provato:
input = getActivity().getContentResolver().openInputStream(contentUri);
ma questo restituisce un errore che indica
Permesso Denial: lettura com.android.providers.downloads.DownloadProvider contenuti uri:// download/all_downloads/2334 da pid = 30950, uid = 10064 richiede android.permission.ACCESS_ALL_DOWNLOADS o grantUriPermission()
Chiaramente non riesco ad accedere ai download (poiché la mia app non li ha avviati - ha fatto il browser) tramite lo ContentProvider
.
btw il vostro primo approccio funziona allright per me, tornando DownloadManager.COLUMN_STATUS == STATUS_SUCCESSFUL e un URI valido nel colonna COLUMN_LOCAL_URI. – southerton