Konfiguruję udostępnianie plików

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

Uwaga: klasa FileProvider jest częścią biblioteki AndroidX Core. Informacje o uwzględnianiu tej biblioteki w aplikacji znajdziesz w sekcji Deklarowanie zależności.

Określanie obiektu FileProvider

Zdefiniowanie FileProvider dla aplikacji wymaga umieszczenia wpisu w pliku manifestu. Ten wpis określa uprawnienia do używania do generowania identyfikatorów URI treści, a także 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 urząd URI, którego chcesz używać na potrzeby identyfikatorów URI treści generowanych przez FileProvider. W tym przykładzie jest to com.example.myapp.fileprovider. W przypadku własnej aplikacji podaj uprawnienie składające się z wartości android:package aplikacji i dołączonego do niej ciągu znaków „fileprovider”. Więcej informacji o wartości uprawnień znajdziesz w temacie Identyfikatory URI treści i w dokumentacji atrybutu android:authorities.

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

Określ katalogi udostępniane

Po dodaniu 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 z nich. Ten fragment kodu zawiera przykładową zawartość pola res/xml/filepaths.xml. Fragment kodu pokazuje też, jak udostępnić podkatalog z 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/ pamięci wewnętrznej aplikacji. Atrybut path współdzieli podkatalog images/ katalogu files/. Atrybut name informuje FileProvider, że ma dodać 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, a każdy z nich określa inny katalog 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 i elementu <cache-path> do udostępniania katalogów w wewnętrznym katalogu pamięci podręcznej. Więcej informacji o elementach podrzędnych, które określają katalogi udostępnione, znajdziesz w dokumentacji FileProvider.

Uwaga: plik XML to jedyny sposób, w jaki możesz określić katalogi, które chcesz udostępnić. Nie możesz dodać katalogu programowo.

Masz już pełną specyfikację identyfikatora FileProvider, który generuje identyfikatory URI treści dla plików znajdujących się w katalogu files/ pamięci wewnętrznej aplikacji lub dla plików w podkatalogach biblioteki files/. Gdy aplikacja generuje identyfikator URI treści pliku, zawiera ona uprawnienia określone w elemencie <provider> (com.example.myapp.fileprovider), ścieżkę myimages/ oraz nazwę pliku.

Jeśli na przykład zdefiniujesz element FileProvider zgodnie z fragmentami przedstawionymi w tej lekcji i poprosisz o identyfikator URI treści dla pliku default_image.jpg, FileProvider zwróci ten identyfikator URI:

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

Dodatkowe informacje na ten temat znajdziesz tutaj: