Teilen von Dateien einrichten

Wenn Sie einer anderen App eine Datei sicher aus Ihrer App anbieten möchten, müssen Sie Ihre App so konfigurieren, dass ein sicherer Handle für die Datei in Form eines Inhalts-URI bereitgestellt wird. Die Android-Komponente FileProvider generiert Inhalts-URIs für Dateien anhand 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 dazu, wie Sie diese Bibliothek in Ihre Anwendung aufnehmen, finden Sie unter Abhängigkeiten deklarieren.

FileProvider angeben

Wenn Sie eine FileProvider für Ihre App definieren möchten, benötigen Sie einen Eintrag in Ihrem Manifest. Dieser Eintrag gibt die Berechtigung zum Generieren von Inhalts-URIs sowie den Namen einer XML-Datei an, in der die Verzeichnisse angegeben sind, die Ihre App freigeben kann.

Das folgende Snippet zeigt, wie du das <provider>-Element, das die Klasse FileProvider, die Zertifizierungsstelle und den XML-Dateinamen angibt, zu deinem Manifest hinzufügst:

<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-Zertifizierungsstelle an, die für Inhalts-URIs verwendet werden soll, die von FileProvider generiert wurden. In diesem Beispiel ist die Befugnis com.example.myapp.fileprovider. Geben Sie für Ihre eigene Anwendung eine Zertifizierungsstelle an, die aus dem Wert android:package der Anwendung besteht und dem der String „fileprovider“ angehängt ist. Weitere Informationen zum „Authority-Wert“ 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 den Namen der Datei ohne die Erweiterung .xml an.Der Inhalt dieser Datei wird im nächsten Abschnitt beschrieben.

Freigabefähige Verzeichnisse angeben

Nachdem Sie das FileProvider zu Ihrem App-Manifest hinzugefügt haben, müssen Sie die Verzeichnisse angeben, die die Dateien enthalten, die Sie freigeben möchten. Erstellen Sie zum Angeben der Verzeichnisse 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/ im 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 Ihrer App frei. Das Attribut path gibt das Unterverzeichnis images/ von files/ frei. Das Attribut name weist den FileProvider an, das Pfadsegment myimages zu Inhalts-URIs für Dateien im Unterverzeichnis files/images/ 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 FileProvider-Referenzdokumentation.

Hinweis:Die XML-Datei ist die einzige Möglichkeit, die Verzeichnisse anzugeben, die Sie freigeben möchten. Ein Verzeichnis lässt sich nicht programmatisch hinzufügen.

Sie haben jetzt eine vollständige Spezifikation für einen FileProvider, der Inhalts-URIs für Dateien im Verzeichnis files/ des internen Speichers Ihrer App oder für Dateien in Unterverzeichnissen von files/ generiert. Wenn Ihre App einen Inhalts-URI für eine Datei generiert, enthält sie die im <provider>-Element (com.example.myapp.fileprovider) angegebene Autorisierung, den Pfad myimages/ und den Namen der Datei.

Wenn Sie beispielsweise einen 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: