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: