Wenn Sie eine Datei aus Ihrer App für eine andere App sicher anbieten möchten, müssen Sie Ihre App so konfigurieren, dass sie einen sicheren Alias für die Datei in Form eines Content-URI anbietet. Die Android-Komponente FileProvider
generiert Inhalts-URIs für Dateien auf Grundlage von Spezifikationen, die Sie in XML angeben. In dieser Lektion erfahren Sie, wie Sie Ihrer Anwendung die Standardimplementierung von FileProvider
hinzufügen und die Dateien angeben, die Sie anderen Anwendungen anbieten möchten.
Hinweis: Die Klasse FileProvider
ist Teil der AndroidX Core Library. Informationen zum Einbinden dieser Bibliothek in Ihre Anwendung finden Sie unter Abhängigkeiten deklarieren.
FileProvider angeben
Damit du eine FileProvider
für deine App definieren kannst, musst du einen Eintrag in deinem Manifest vornehmen. Dieser Eintrag gibt die Berechtigung zum Generieren von Inhalts-URIs sowie den Namen einer XML-Datei an, die die Verzeichnisse angibt, die Ihre Anwendung freigeben kann.
Das folgende Snippet zeigt, wie du deinem Manifest das Element <provider>
hinzufügst, das die Klasse FileProvider
, die Berechtigung und den Namen der XML-Datei angibt:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ...> <provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.myapp.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> ... </application> </manifest>
In diesem Beispiel gibt das Attribut android:authorities
die URI-Befugnis an, die du für von FileProvider
generierte Inhalts-URIs verwenden möchtest.
In diesem Beispiel ist das com.example.myapp.fileprovider
. Geben Sie für Ihre eigene Anwendung eine Zertifizierungsstelle an, die aus dem Wert android:package
der Anwendung besteht, an den der String „fileprovider“ angehängt wird. Weitere Informationen zum Wert „Authority“ finden Sie unter Inhalts-URIs und in der Dokumentation zum Attribut android:authorities
.
Das untergeordnete Element <meta-data>
von <provider>
verweist auf eine XML-Datei, in der die Verzeichnisse angegeben sind, die Sie freigeben möchten. Das Attribut android:resource
gibt den Pfad und Namen der Datei ohne die Erweiterung .xml
an.Der Inhalt dieser Datei wird im nächsten Abschnitt beschrieben.
Freigebbare Verzeichnisse angeben
Nachdem Sie das FileProvider
Ihrem App-Manifest hinzugefügt haben, müssen Sie die Verzeichnisse angeben, die die Dateien enthalten, die Sie freigeben möchten. Um die Verzeichnisse anzugeben, erstellen Sie zuerst die Datei filepaths.xml
im Unterverzeichnis res/xml/
Ihres Projekts. Geben Sie in dieser Datei die Verzeichnisse an, indem Sie für jedes Verzeichnis ein XML-Element hinzufügen. Das folgende Snippet zeigt ein Beispiel für den Inhalt von res/xml/filepaths.xml
. Das Snippet zeigt auch, wie Sie ein Unterverzeichnis des Verzeichnisses files/
in Ihrem internen Speicherbereich freigeben:
<paths> <files-path path="images/" name="myimages" /> </paths>
In diesem Beispiel gibt das Tag <files-path>
Verzeichnisse im Verzeichnis files/
des internen Speichers der Anwendung frei. Das Attribut path
verwendet das Unterverzeichnis images/
von files/
. Das Attribut name
weist FileProvider
an, den Inhalts-URIs für Dateien im Unterverzeichnis files/images/
das Pfadsegment myimages
hinzuzufügen.
Das <paths>
-Element kann mehrere untergeordnete Elemente haben, die jeweils ein anderes Verzeichnis für die Freigabe angeben. Zusätzlich zum Element <files-path>
können Sie das Element <external-path>
verwenden, um Verzeichnisse im externen Speicher freizugeben, und das Element <cache-path>
, um Verzeichnisse in Ihrem internen Cache-Verzeichnis freizugeben. Weitere Informationen zu den untergeordneten Elementen, die freigegebene Verzeichnisse angeben, finden Sie in der Referenzdokumentation zu FileProvider
.
Hinweis: Die Verzeichnisse, die Sie freigeben möchten, können nur über die XML-Datei angegeben werden. Sie können keine Verzeichnisse programmatisch hinzufügen.
Sie haben jetzt die vollständige Spezifikation eines FileProvider
, der Inhalts-URIs für Dateien im Verzeichnis files/
des internen Speichers der Anwendung oder für Dateien in Unterverzeichnissen von files/
generiert. Wenn Ihre App einen Inhalts-URI für eine Datei generiert, enthält er die im Element <provider>
(com.example.myapp.fileprovider
) angegebene Autorität, den Pfad myimages/
und den Namen der Datei.
Wenn Sie beispielsweise ein FileProvider
gemäß den Snippets in dieser Lektion definieren und einen Inhalts-URI für die Datei default_image.jpg
anfordern, gibt FileProvider
den folgenden URI zurück:
content://com.example.myapp.fileprovider/myimages/default_image.jpg
Weitere Informationen finden Sie hier: