2016-04-29 11 views
1

Ich versuche, Bilder mit meiner App zu akzeptieren, um sie an einen Server zu senden. Das Einrichten des Intent-Filters war einfach und das funktioniert wie ein Zauber. Die Sache, die ich nicht herausfinden kann, ist die Art, wie ich den Dateipfad von der uri in der Absicht abrufen muss.Absicht empfangen von Aktion senden generiert SecurityException auf URI

Ich empfange Absichten auf meine Tätigkeit mit diesem Filter

<intent-filter> 
    <action android:name="android.intent.action.SEND" /> 
    <action android:name="android.intent.action.SEND_MULTIPLE" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <data android:mimeType="image/jpeg" /> 
    <data android:mimeType="image/png" /> 
    <data android:mimeType="image/gif" /> 
</intent-filter> 

Durch den Versuch, die uri bekommen Sie den Dateipfad ich diesen Fehler zu verarbeiten durch den Aufruf takePersistableUriPermission (uri, modeFlags):

java.lang.SecurityException: No persistable permission grants found for UID 10098 and Uri 0 @ content://media/external/images/media/124 

Die Logik, die ich verwende, funktioniert, um Bilder mit einer Absicht von innerhalb meiner App anzufordern, aber das Empfangen einer Absicht von außerhalb der App erzeugt den Fehler.

für Kitkat und oben:

final int flags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    final String[] imageColumns = {MediaStore.Images.Media.DATA}; 
    getActivity().getContentResolver().takePersistableUriPermission(uri, flags); 
    String id = uri.getLastPathSegment().split(":")[1]; 
    Cursor imageCursor = context.managedQuery(getStorageUri(), imageColumns, MediaStore.Images.Media._ID + "=" + id, null, null); 
+0

Erhalten Sie diesen Fehler in Android 6.0 und höher? –

+0

, weil Sie android: exported = "false" gesetzt haben, was bedeutet, dass andere Prozesse nicht auf diese Aktivität zugreifen können. So stellen Sie es auf wahr und tun das gleiche wird es nicht crashen –

+0

@SanjayKakadiya keine kitkat und oben, nur getestet, um sicher zu sein. – SjoerdvGestel

Antwort

0

Die Sache, die ich nicht scheinen, um herauszufinden kann, ist die Art, wie ich brauche den Dateipfad von der uri in der Absicht, abzurufen.

Es gibt keinen "Dateipfad von der URI". Eine Uri ist keine Datei.

Durch den Versuch, die uri Proses den Dateipfad ich diesen Fehler zu erhalten, indem takePersistableUriPermission Aufruf (uri, modeFlags):

das bedeutet nur, dass Sie nicht die Uri, sobald Ihr Prozess endet verwenden können.

für Kitkat und oben:

ACTION_GET_CONTENT ist nicht verpflichtet, Ihnen einige Uri zurück, die verarbeitet werden kann, dass Code.

Um den durch die Uri, use openInputStream() on your ContentResolver identifizierten Inhalt zu verbrauchen.

+0

Ich vermute du hast meine Frage falsch verstanden. Zum einen ist mir bewusst, dass der URI nicht den Dateipfad enthält und daher muss ich ihn verarbeiten, um den Dateipfad zu erhalten. Ich verwende hier einen Intent-Filter, der eine Absicht von einer anderen App erhält, die diesen Inhalt sendet, nicht "ACTION_GET_CONTENT" mit Startaktivität für das Ergebnis. – SjoerdvGestel

+1

@SjoerdvGestel: "und deshalb muss ich es verarbeiten, um den Dateipfad zu erhalten" - Sie können es nicht "verarbeiten, um den Dateipfad zu erhalten", außer vielleicht "openInputStream()" zu verwenden, um den Inhalt in eine Datei zu kopieren Steuerung. Der Benutzer muss keine Inhalte auswählen, auf die Sie über das Dateisystem zugreifen können.Der Inhalt kann sich im internen Speicher einer anderen App oder auf einem Wechselspeicher oder in einer BLOB-Spalte der Datenbank einer anderen App oder in der Cloud befinden, die von der anderen App heruntergeladen werden muss. – CommonsWare

+1

@SjoerdvGestel: In ähnlicher Weise ist es nicht erforderlich, dass Sie von einer Drittanbieteranwendung persistente Berechtigungen für diese Uri erhalten. Das liegt an der anderen App zu bieten; Sie können Entwickler nicht zwingen, es anzubieten, kurz, schwere Waffen zu verwenden. – CommonsWare

Verwandte Themen