Teilen von Dateien einrichten

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: