Pobierz ścieżkę do pliku ze złapanego zamiaru DownloadManager
Od Androida 4.2, jeśli użytkownik pobiera jakiś plik w przeglądarce, używany jest DownloadManager. Jeśli użytkownik kliknie powiadomienie „pobierz kompletne”, Intent jest i zawsze był uruchamiany. Przed Androidem 4.2 zamiar mieć ścieżkę pobranego pliku w treści, tak aby:
intent.getData()
zwróci ciąg taki jakfile:///storage/emulated/0/Download/some_file.ext
. Jednak od wersji Androida 4.2 menedżer pobierania nadaje i używa zamiarucontent
system, taki jakcontent://downloads/all_downloads/2334
.
Jak pobrać ścieżkę pliku lokalnego dla pobranego pliku?
Próbowałem:
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));
}
Ale kursor nigdy nie zwraca żadnych wierszy (takq.getCount() == 0
i dlatego ostatnireturn
instrukcja rzuca wyjątek). Co więcej, włamanie przez parsowanie pobieranego pliku identyfikatora z Uri wydaje się dziwne.
AKTUALIZACJA: Próbowałem też:
input = getActivity().getContentResolver().openInputStream(contentUri);
ale zwraca to błąd
Odmowa uprawnień: odczyt zawartości com.android.providers.downloads.DownloadProvider: // pliki do pobrania / all_downloads / 2334 z pid = 30950, uid = 10064 wymagają android.permission.ACCESS_ALL_DOWNLOADS lub grantUriPermission ()
Najwyraźniej nie mogę uzyskać dostępu do plików do pobrania (ponieważ moja aplikacja ich nie zainicjowała - przeglądarka) za pośrednictwemContentProvider
.