Konfiguruję udostępnianie plików

Aby bezpiecznie udostępniać plik z innej aplikacji innej aplikacji, musisz skonfigurować w niej bezpieczny uchwyt w postaci identyfikatora URI treści. Komponent FileProvider na Androida generuje identyfikatory URI treści na podstawie specyfikacji podanych w pliku XML. Z tej lekcji dowiesz się, jak dodać domyślną implementację interfejsu FileProvider do swojej aplikacji i określić, które pliki chcesz oferować innym aplikacjom.

Uwaga: klasa FileProvider jest częścią biblioteki podstawowej AndroidaX. Informacje o umieszczaniu tej biblioteki w aplikacji znajdziesz w artykule Deklarowanie zależności.

Określ FileProvider

Zdefiniowanie atrybutu FileProvider dla aplikacji wymaga wpisu w pliku manifestu. Ten wpis określa uprawnienia do użycia do generowania identyfikatorów URI treści oraz nazwę pliku XML określającego katalogi, które aplikacja może udostępniać.

Ten fragment kodu pokazuje, jak dodać do pliku manifestu element <provider>, który określa klasę FileProvider, urząd i nazwę pliku XML:

<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>

W tym przykładzie atrybut android:authorities określa autorytet URI, którego chcesz używać w przypadku identyfikatorów URI treści wygenerowanych przez FileProvider. W tym przykładzie organem jest com.example.myapp.fileprovider. W przypadku własnej aplikacji określ urząd składający się z wartości android:package aplikacji z dołączonym do niej ciągiem znaków „fileprovider”. Więcej informacji o wartości urzędu certyfikacji znajdziesz w temacie Identyfikatory URI treści i w dokumentacji atrybutu android:authorities.

Element podrzędny <meta-data> elementu <provider> wskazuje plik XML, który określa katalogi, które chcesz udostępnić. Atrybut android:resource to ścieżka i nazwa pliku bez rozszerzenia .xml.Zawartość tego pliku opisaliśmy w następnej sekcji.

Określ katalogi, które można udostępniać

Po dodaniu atrybutu FileProvider do pliku manifestu aplikacji musisz określić katalogi zawierające pliki, które chcesz udostępnić. Aby określić katalogi, zacznij od utworzenia pliku filepaths.xml w podkatalogu res/xml/ projektu. W tym pliku określ katalogi, dodając element XML dla każdego katalogu. Ten fragment kodu zawiera przykładową zawartość pola res/xml/filepaths.xml. Fragment kodu pokazuje też, jak udostępnić podkatalog katalogu files/ w pamięci wewnętrznej:

<paths>
    <files-path path="images/" name="myimages" />
</paths>

W tym przykładzie tag <files-path> udostępnia katalogi w katalogu files/ w pamięci wewnętrznej aplikacji. Atrybut path korzysta z podkatalogu images/ usługi files/. Atrybut name informuje usługę FileProvider, aby dodała segment ścieżki myimages do identyfikatorów URI treści dla plików w podkatalogu files/images/.

Element <paths> może mieć wiele elementów podrzędnych, z których każdy określa inną ścieżkę do udostępnienia. Oprócz elementu <files-path> możesz używać elementu <external-path> do udostępniania katalogów w pamięci zewnętrznej oraz elementu <cache-path> do udostępniania katalogów w katalogu wewnętrznej pamięci podręcznej. Więcej informacji o elementach podrzędnych, które określają katalogi udostępnione, znajdziesz w dokumentacji referencyjnej (FileProvider).

Uwaga: plik XML to jedyny sposób na określenie katalogów, które chcesz udostępnić. Nie możesz automatycznie dodawać katalogu.

Masz już pełną specyfikację obiektu FileProvider, który generuje identyfikatory URI treści dla plików w katalogu files/ pamięci wewnętrznej aplikacji lub plików w podkatalogach files/. Gdy aplikacja wygeneruje identyfikator URI treści pliku, zawiera on wiarygodność określoną w elemencie <provider> (com.example.myapp.fileprovider), ścieżkę myimages/ i nazwę pliku.

Jeśli na przykład zdefiniujesz identyfikator FileProvider na podstawie fragmentów tej lekcji i w przypadku pliku default_image.jpg określisz żądanie identyfikatora URI treści, FileProvider zwróci ten identyfikator URI:

content://com.example.myapp.fileprovider/myimages/default_image.jpg

Więcej informacji znajdziesz w tych artykułach: