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: