Ruft den Dateipfad von der abgefangenen DownloadManager-Absicht ab

Seit Android 4.2 wird der DownloadManager verwendet, wenn ein Benutzer eine Datei im Browser herunterlädt. Wenn der Benutzer auf die Benachrichtigung "Download abgeschlossen" klickt, wird und wurde Intent immer gestartet. Vor Android 4.2 war die Absicht, den Pfad der heruntergeladenen Datei im Inhalt zu haben, so dass:

intent.getData()

würde einen String wiefile:///storage/emulated/0/Download/some_file.ext. Seit Android 4.2 sendet der Download-Manager jedoch und beabsichtigt mit einemcontent Schema, wiecontent://downloads/all_downloads/2334.

Wie rufe ich den lokalen Dateipfad für eine heruntergeladene Datei ab?

Ich habe Folgendes versucht:

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

Der Cursor gibt jedoch niemals Zeilen zurück (soq.getCount() == 0 und dafür das letztereturn Anweisung löst eine Ausnahme aus). Auch der Hack durch Parsen der Download-Datei-ID aus dem Uri scheint seltsam.

AKTUALISIEREN: Ich habe auch versucht:

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

Dies gibt jedoch einen Fehler zurück, der angibt

Berechtigungsverweigerung: Lesen von com.android.providers.downloads.DownloadProvider uri-Inhalt: // downloads / all_downloads / 2334 aus pid = 30950, uid = 10064 erfordert android.permission.ACCESS_ALL_DOWNLOADS oder grantUriPermission ()

Offensichtlich kann ich nicht über das auf die Downloads zugreifen (da meine App sie nicht initiiert hat - der Browser hat dies getan)ContentProvider.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage