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.

questionAnswers(3)

yourAnswerToTheQuestion