2017-12-05 1 views
1

Ich bitte einen Benutzer, ein PDF-Dokument mit ACTION_OPEN_DOCUMENT zu wählen. Die Absicht gibt einen Inhalts-URI zurück.SecurityException on Intent.ACTION_VIEW beim Versuch, PDF zu öffnen

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
    intent.setType("application/pdf"); 
    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); 
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 

Der Inhalt URI im Format - Inhalt: //com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FSample%20PDF.pdf

Nun möchte ich, dass der Benutzer wieder auf dasselbe Dokument zugreift - später von einer separaten Aktivität. Also schreibe ich den folgenden Code -

Intent pdfIntent = new Intent(Intent.ACTION_VIEW); 
        pdfIntent.setData(document.getLocalUri()); 
        pdfIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
        mContext.startActivity(pdfIntent); 

Aber ich bekomme die folgende Fehlermeldung -

java.lang.SecurityException: UID 10197 does not have permission to content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FSample%20PDF.pdf [user 0]; you could obtain access using ACTION_OPEN_DOCUMENT or related APIs 

Was mache ich falsch?

+0

haben Sie die Berechtigung in Manifest deklariert? –

+0

Fügen Sie diese Zeile zu Ihrem Manifest hinzu '' –

Antwort

0

Was mache ich falsch?

Höchstwahrscheinlich Ihr Problem hier liegt:

Ich möchte der Benutzer wieder das gleiche Dokument zugreifen - später, von einer separaten Aktivität

Die Aktivität, die angefordert und erhalten die Uri an den Inhalt hat Rechte an diesem Inhalt ... aber nichts anderes deiner App tut. Dazu gehören andere Komponenten in Ihrem aktuellen Prozess, alle Komponenten in zukünftigen Prozessen.

Wenn dies eine separate Aktivität ist, aber immer noch in der gleichen Anwendungsinstanz (d. H. Ihr Prozess wurde nicht beendet, seit Sie die Uri erhalten haben), müssen Sie die Rechte für diesen Inhalt an die separate Aktivität übergeben. Übergeben Sie die Uri über die Facette "Daten" der Intent und verwenden Sie setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION), wie Sie mit der ACTION_VIEW tun. Siehe this sample app, wo ich FLAG_GRANT_READ_URI_PERMISSION verwende, um einem Service Rechte zu gewähren, um den Inhalt lesen zu können.

Wenn Ihre Absicht, den Uri Wert bestehen bleibt selbst (zum Beispiel speichern Sie es als eine Zeichenfolge in einer Datenbank) und es in Zukunft nutzen, können Sie stattdessen takePersistableUriPermission() auf ContentResolver verwenden langfristigen Zugriff auf die Inhalte zu beantragen. Dies sollte gelingen (ich kenne kein Szenario, bei dem Ihnen der Zugriff sofort verweigert wird). Sie sollten Zugriff haben, bis etwas drastisch mit dem Inhalt passiert, z. B. wenn der Benutzer es löscht.

+0

Vielen Dank. takePersistableUriPermission() war was ich brauchte. Ich bin gerade auf Ihren Blog gestoßen - https://commonsware.com/blog/2016/03/15/how-consume-content-uri.html - habe eine Menge von der URI-Unordnung für mich geklärt :) – user3911483

Verwandte Themen