Uygulamanızdan başka bir uygulamaya güvenli bir şekilde dosya sunmak için uygulamanızı, dosya için içerik URI'si biçiminde güvenli bir herkese açık kullanıcı adı sunacak şekilde yapılandırmanız gerekir. Android FileProvider
bileşeni, XML'de sağladığınız özelliklere göre dosyalar için içerik URI'leri oluşturur. Bu derste, uygulamanıza varsayılan FileProvider
uygulamasını nasıl ekleyeceğiniz ve diğer uygulamalara sunmak istediğiniz dosyaları nasıl belirteceğiniz gösterilmektedir.
Not: FileProvider
sınıfı, AndroidX Core Library'nin bir parçasıdır. Bu kitaplığı uygulamanıza ekleme hakkında bilgi edinmek için Bağımlılıkları bildirme bölümüne bakın.
FileProvider’ı belirt
Uygulamanız için FileProvider
tanımlamak istiyorsanız manifest dosyanızda bir giriş yapmanız gerekir. Bu giriş, içerik URI'leri oluştururken kullanılacak yetkiyi ve uygulamanızın paylaşabileceği dizinleri belirten bir XML dosyasının adını belirtir.
Aşağıdaki snippet'te FileProvider
sınıfını, yetkiliyi ve XML dosya adını belirten <provider>
öğesini manifest dosyanıza nasıl ekleyeceğiniz gösterilmektedir:
<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>
Bu örnekte android:authorities
özelliği, FileProvider
tarafından oluşturulan içerik URI'leri için kullanmak istediğiniz URI yetkilisini belirtir.
Örnekte otorite com.example.myapp.fileprovider
'tir. Kendi uygulamanız için uygulamanın android:package
değerinden
oluşan ve sonuna "fileprovider" dizesi eklenmiş bir yetkili belirtin. Yetki değeri hakkında daha fazla bilgi edinmek için İçerik URI'leri konusuna ve android:authorities
özelliğiyle ilgili belgelere göz atın.
<provider>
öğesinin <meta-data>
alt öğesi, paylaşmak istediğiniz dizinleri belirten bir XML dosyasını gösterir. android:resource
özelliği, .xml
uzantısı olmadan dosyanın yolu ve adıdır.Bu dosyanın içeriği bir sonraki bölümde açıklanmıştır.
Paylaşılabilir dizinleri belirtin
FileProvider
öğesini uygulama manifestinize ekledikten sonra, paylaşmak istediğiniz dosyaların bulunduğu dizinleri belirtmeniz gerekir. Dizinleri belirtmek için projenizin res/xml/
alt dizininde filepaths.xml
dosyasını oluşturarak başlayın. Bu dosyada her dizin için bir XML öğesi ekleyerek dizinleri belirtin. Aşağıdaki snippet'te, res/xml/filepaths.xml
içeriğinin bir örneği gösterilmektedir. Sana Özel bölümünde, files/
dizininin bir alt dizininin dahili depolama alanınızda nasıl paylaşılacağı da gösterilmektedir:
<paths> <files-path path="images/" name="myimages" /> </paths>
Bu örnekte <files-path>
etiketi, uygulamanızın dahili depolama alanının files/
dizininde bulunan dizinleri paylaşır. path
özelliği, files/
'nin images/
alt dizinini paylaşır. name
özelliği, FileProvider
öğesine myimages
yol segmentini files/images/
alt dizinindeki dosyaların içerik URI'lerine eklemesini bildirir.
<paths>
öğesinin, her biri paylaşılacak farklı bir dizin belirten birden fazla alt öğesi olabilir. <files-path>
öğesine ek olarak, harici depolamadaki dizinleri paylaşmak için <external-path>
öğesini, dahili önbellek dizininizdeki dizinleri paylaşmak için ise <cache-path>
öğesini kullanabilirsiniz. Paylaşılan dizinleri belirten alt öğeler hakkında daha fazla bilgi edinmek için FileProvider
referans belgelerine bakın.
Not: Paylaşmak istediğiniz dizinleri belirtmenin tek yolu XML dosyasıdır. Dizinleri programatik olarak ekleyemezsiniz.
Artık uygulamanızın dahili depolama alanının files/
dizininde veya files/
'un alt dizinlerindeki dosyalar için içerik URI'leri oluşturan bir FileProvider
'nin tam spesifikasyonuna sahipsiniz. Uygulamanız bir dosya için içerik URI'si oluşturduğunda <provider>
öğesinde (com.example.myapp.fileprovider
) belirtilen yetkiliyi, myimages/
yolunu ve dosyanın adını içerir.
Örneğin, bu dersteki snippet'lere göre bir FileProvider
tanımlar ve default_image.jpg
dosyası için bir içerik URI'si isterseniz FileProvider
aşağıdaki URI'yı döndürür:
content://com.example.myapp.fileprovider/myimages/default_image.jpg
Daha fazla ilgili bilgi için aşağıdaki kaynakları inceleyebilirsiniz: