2016-06-01 11 views
1

Ich versuche, mehrere URIs über eine Intent mit Hilfe von FileProvider von einer App zur anderen bereitzustellen.So gewähren Sie Berechtigungen Bereitstellung mehrerer URIs über Absicht mit FileProvider

Ich habe es funktioniert, wenn nur eine URI wie das Senden von folgenden:

resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
resultIntent.setDataAndType(contentUri,getContentResolver().getType(contentUri)); 

setResult(RESULT_OK, resultIntent); 

In meinem "Empfang" app ich so in onActivityResult weiter:

Uri returnUri = data.getData(); 
ParcelFileDescriptor mInputPFD = getContext().getContentResolver().openFileDescriptor(returnUri, "r"); 

Jetzt habe ich versucht, das Senden ein ArrayList von URIs:

resultIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList); 
resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
setResult(RESULT_OK, resultIntent); 

aber die Erlaubnis erteilt Flagge onl y gilt für den URI, der in setData() festgelegt wurde. Daher kann ich in der empfangenden App nicht über die ArrayList auf die URIs zugreifen. Ich las über ClipData als Lösung, aber ich bin unfortunatley mit Min SDK 15.em

Also meiner Frage ist gezwungen zu gehen, ist es eine gute Idee, um die Berechtigungen manuell in meinem Empfang App mit so etwas wie

einstellen
context.grantUriPermission("com.example.provider", returnUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 

für jeden URI würde ich bekommen, wenn ich die Option "ArrayList" wähle und sie später widerrufen? Kann ich das überhaupt machen? Könnte nicht jede andere App auf die privaten Dateien der Provider-App zugreifen?

Und welches Paket muss ich hier angeben? Meine Provider-App oder mein Empfänger-App-Paket, da ich das nicht zum Laufen bekomme und nur eine Ausnahme wegen fehlender Erlaubnis bekomme.

Jede Hilfe oder Hinweise werden geschätzt

+0

"Konnte nicht jede andere App auch auf die privaten Dateien der Provider-App zugreifen?" - Nein, weil Sie nur Berechtigungen für die App erteilen, die Sie im Aufruf grantUriPermission() 'nennen. "Und welches Paket muss ich hier angeben?" -- der Empfänger. "ist es eine gute Idee, die Berechtigungen manuell in meiner empfangenden App zu setzen" - vor API Level 21 haben Sie nicht viel Auswahl AFAIK. – CommonsWare

+0

danke für die Antworten @CommonsWare. Ich erhalte die folgende Ausnahme: Berechtigungsverweigerung: Öffnen des Providers, der nicht [...] exportiert wird. Aber "android: exported" sollte "falsch" sein, denke ich. Muss ich 'grantUriPermission' im Provider oder Empfänger anrufen? – daco

+0

"Aber Android: exportiert sollte falsch sein, denke ich?" - Ja, das ist eine Voraussetzung von 'FileProvider'. Msgstr "Muss ich grantUriPermission im Provider oder Empfänger anrufen?" - IMHO, Sie nennen es in Ihrer 'Activity', kurz bevor Sie' startActivity() 'aufrufen, um eine Drittanbieter-App zu starten, die Ihre' Uri'-Werte verwendet. Sehen Sie [dieses Beispielprojekt] (https://github.com/commonsguy/cw-omnibus/tree/master/Camera/FileProvider) für ein ähnliches Szenario wie Ihres, wobei ich 'grantUriPermission()' für den 'EXTRA_OUTPUT' Wert verwende in einer 'ACTION_IMAGE_CAPTURE'' Absicht'. – CommonsWare

Antwort

4

Gelöst es.

Mein Problem war, dass ich in meinem grantUriPermission()Empfänger App und nicht in dem Provider App namens wie es sein sollte. Durch das Aufrufen des Folgenden wurden die Berechtigungsausnahmen behoben:

getApplicationContext().grantUriPermission(getCallingPackage(), fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 
Verwandte Themen