Dosya paylaşımını ayarlama

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: