Android depolama alanı kullanım alanları ve en iyi uygulamalar

Android 10, kullanıcılara dosyalarıyla ilgili daha fazla kontrol imkanı sunmak ve dosya karmaşasını sınırlamak için uygulamalara kapsamlı depolama adı verilen yeni bir depolama paradigması getirdi. Kapsamlı depolama alanı, uygulamaların cihazın harici depolama alanındaki dosyaları depolama ve bu dosyalara erişme şeklini değiştirir. Uygulamanızı, kapsamlı depolama alanını destekleyen bir sürüme taşımanıza yardımcı olması için bu kılavuzda açıklanan yaygın depolama alanı kullanım alanlarına yönelik en iyi uygulamaları takip edin. Kullanım alanları medya dosyalarını işleme ve medya dışı dosyaları işleme olmak üzere iki kategoriye ayrılır.

Uygulamanız çoğu durumda, diğer uygulamaların erişmesi gerekmeyen veya erişmemesi gereken dosyalar oluşturur. Sistem, bu tür dosyaları yönetmek için uygulamaya özel depolama yerleri sağlar.

Android'de dosyaları nasıl depolayacağınız ve dosyalara nasıl erişeceğiniz hakkında daha fazla bilgi edinmek için depolama alanı eğitim kılavuzlarını inceleyin.

Medya dosyalarını işleme

Bu bölümde, medya dosyalarını (video, resim ve ses dosyaları) işlemeyle ilgili bazı yaygın kullanım alanları açıklanmakta ve uygulamanızın kullanabileceği üst düzey yaklaşım açıklanmaktadır. Aşağıdaki tabloda bu kullanım alanlarının her biri özetlenmiştir ve daha ayrıntılı bilgi içeren bölümlerin bağlantıları verilmiştir.

Kullanım alanı Özet
Tüm resim veya video dosyalarını gösterme Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Belirli bir klasördeki resimleri veya videoları gösterme Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Fotoğraflardaki konum bilgilerine erişme Uygulamanız kapsamlı depolama alanı kullanıyorsa şu yaklaşımlardan birini kullanın. Farklı bir Bu yaklaşım, kapsamlı depolamanın kapsamı dışında kalmayı seçmediği durumlar olabilir.
Yeni indirilenler için depolama konumunu tanımlama Uygulamanız sınırlı depolama alanı kullanıyorsa tek bir yaklaşım kullanın. Uygulamanız sınırlı depolama alanını devre dışı bırakırsa farklı bir yaklaşım kullanın.
Kullanıcı medya dosyalarını bir cihaza aktarma Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Şurada birden fazla medya dosyasını değiştirin veya silin: tek bir işlemle Android 11 için tek bir yaklaşım kullanın. Android 10 için kapsamlı depolama alanını devre dışı bırakın ve bunun yerine Android 9 ve önceki sürümlere yönelik yaklaşımı kullanın.
Mevcut tek bir resmi içe aktarma Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Tek resim çekme Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Medya dosyalarını diğer uygulamalarla paylaşma Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Medya dosyalarını belirli bir uygulamayla paylaşma Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Doğrudan dosya yollarını kullanan kod veya kitaplıklardan dosyalara erişme Android 11 için tek bir yaklaşım kullanın. Android 10 için kapsamlı depolama alanını devre dışı bırakın ve bunun yerine Android 9 ve önceki sürümler için yaklaşımı kullanın.

Birden fazla klasördeki resim veya video dosyalarını gösterme

query() API'sini kullanarak bir medya koleksiyonunu sorgulayabilirsiniz. Medya dosyalarını filtrelemek veya sıralamak için projection, selection, selectionArgs ve sortOrder parametrelerini ayarlayın.

Belirli bir klasördeki resimleri veya videoları gösterme

Bu yaklaşımı kullanın:

  1. Uygulama İzinleri İsteme bölümünde belirtilen en iyi uygulamalara uyarak READ_EXTERNAL_STORAGE iznini isteyin.
  2. Şu değere göre medya dosyalarını al: MediaColumns.DATA, Bu değer, diskteki medya öğesinin mutlak dosya sistemi yolunu içerir.

Not: Mevcut bir medya dosyasına eriştiğinizde DATA sütunundan görebilirsiniz. Bunun nedeni, bu değerin geçerli bir dosya yoluna sahip olmasıdır. Ancak, dosyanın her zaman kullanılabilir olduğunu varsaymayın. Oluşabilecek dosya tabanlı G/Ç hatalarını gidermeye hazır olun.

Öte yandan, medya dosyası oluşturmak veya güncellemek için DATA sütununu kullanmayın. Bunun yerine DISPLAY_NAME ve RELATIVE_PATH sütunlarını kullanın.

Fotoğraflardaki konum bilgilerine erişme

Uygulamanız kapsamlı depolama alanı kullanıyorsa medya depolama alanı kılavuzunun Fotoğraflardaki konum bilgileri bölümündeki adımları uygulayın.

Yeni indirmeler için depolama yerini tanımlama

Uygulamanız kapsamlı depolama alanı kullanıyorsa indirdiğiniz medya dosyalarını depolamak için seçtiğiniz konuma dikkat edin.

Diğer uygulamalar dosyalara erişmek istiyorsa indirmeler veya doküman koleksiyonları için iyi tanımlanmış medya koleksiyonları kullanmayı deneyin.

Android 11 ve sonraki sürümlerde, harici uygulamaya özel içindeki dosyalar DownloadManager ürününü kullansanız bile dizin diğer uygulamaların erişimine açık olmaz. getirebileceksiniz.

Kullanıcı medya dosyalarını bir cihaza aktarma

Kullanıcı medyasının depolanacağı uygun bir varsayılan konum tanımlayın dosyalar:

Tek bir işlemde birden fazla medya dosyasını değiştirin veya silin

Uygulamanızın çalıştığı Android sürümlerine göre mantığı dahil edin.

Android 11 çalıştıran cihazlar

Şu yaklaşımı kullanın:

  1. MediaStore.createWriteRequest() veya MediaStore.createTrashRequest() kullanarak uygulamanızın yazma veya silme isteği için bekleyen bir intent oluşturun ve ardından bu intent'i çağırarak kullanıcıdan bir dosya grubunu düzenleme izni isteyin.
  2. Kullanıcının yanıtını değerlendirin:

    • İzin verildiyse değiştirme veya silme işlemine devam edin.
    • İzin verilmediyse kullanıcıya bu özelliğin neden uygulamanızın izne ihtiyacı var.

Android 11 ve sonraki sürümlerde kullanılabilen bu yöntemleri kullanarak medya dosyası gruplarını yönetme hakkında daha fazla bilgi edinin.

Android 10 çalıştıran cihazlar

Uygulamanız Android 10'u (API düzeyi 29) hedefliyorsa kapsamlı olmamayı devre dışı bırakın depolama alanı ve Android 9 için yaklaşımı kullanmaya devam edin. ve daha düşük değerini ayarlayın.

Android 9 veya önceki sürümleri çalıştıran cihazlar

Bu yaklaşımı kullanın:

  1. Uygulama İzinleri İsteme bölümünde belirtilen en iyi uygulamalara uyarak WRITE_EXTERNAL_STORAGE iznine başvurun.
  2. Medya dosyalarını değiştirmek veya silmek için MediaStore API'yi kullanın.

Mevcut tek bir resmi içe aktarma

Mevcut tek bir resmi içe aktarmak istediğinizde (örneğin, bir fotoğraf kullanıyorsanız, uygulamanız kullanıcı rızası almak için kendi veya sistem seçiciyi kullanabilir.

Kendi kullanıcı arayüzünüzü sunma

Şu yaklaşımı kullanın:

  1. Uygulama İzinleri İsteme bölümünde açıklanan en iyi uygulamaları izleyerek READ_EXTERNAL_STORAGE için istekte bulunabilirsiniz izni gerekir.
  2. Medya koleksiyonunu sorgulamak için query() API'yi kullanın.
  3. Sonuçları uygulamanızın özel kullanıcı arayüzünde görüntüleyin.

Sistem seçiciyi kullanma

ACTION_GET_CONTENT'ı kullanma kullanıcının içe aktarılacak bir resim seçmesini isteyen intent.

Sistem seçicinin kullanabileceğiniz başka bir araç var. setType() veya EXTRA_MIME_TYPES.

Tek bir resim çek

Uygulamanızda kullanmak üzere tek bir resim çekmek istediğinizde (örneğin fotoğrafı olarak) kullanmak için ACTION_IMAGE_CAPTURE kullanıcıdan cihazın kamerasını kullanarak fotoğraf çekmesini isteme. Sistem çekilen fotoğrafı MediaStore.Images tablosu.

Medya dosyalarını diğer uygulamalarla paylaşma

Şunu kullanın: insert() yöntemini kullanabilirsiniz. Daha fazla bilgi için medya depolama alanı kılavuzunun Öğe ekleme bölümüne bakın.

Medya dosyalarını belirli bir uygulamayla paylaşma

Dosya paylaşımını ayarlama kılavuzunda açıklandığı şekilde Android FileProvider bileşenini kullanın.

Doğrudan dosya yollarını kullanan kod veya kitaplıklardan dosyalara erişme

Uygulamanızın çalıştığı Android sürümlerine göre mantık ekleyin.

Android 11 çalıştıran cihazlar

Bu yaklaşımı kullanın:

  1. Uygulama İzinleri İsteme bölümünde açıklanan en iyi uygulamaları izleyerek READ_EXTERNAL_STORAGE için istekte bulunabilirsiniz izni gerekir.
  2. Dosyalara doğrudan dosya yollarını kullanarak erişin.

Daha fazla bilgi için doğrudan dosya yollarına kaydedilir.

Android 10'da çalışıyor

Uygulamanız Android 10'u (API düzeyi 29) hedefliyorsa kapsamlı olmamayı devre dışı bırakın depolama alanı ve Android 9 için yaklaşımı kullanmaya devam edin. ve daha düşük değerini ayarlayın.

Android 9 veya önceki sürümleri çalıştıran cihazlar

Şu yaklaşımı kullanın:

  1. Uygulama İzinleri İsteme bölümünde açıklanan en iyi uygulamaları izleyerek WRITE_EXTERNAL_STORAGE için istekte bulunabilirsiniz izni gerekir.
  2. Dosyalara doğrudan dosya yollarını kullanarak erişebilirsiniz.

Medya dışı dosyaları işleme

Bu bölümde, medya dışı dosyaların işlenmesiyle ilgili yaygın kullanım alanlarından bazıları açıklanmaktadır ve uygulamanızda kullanabileceğiniz genel yaklaşımı açıklar. Aşağıdaki tabloda bu kullanım alanlarının her biri özetlenmiştir. Ayrıca, daha fazla ayrıntı içeren bölümlerin bağlantıları da verilmiştir.

Kullanım alanı Özet
Doküman dosyası açma Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Dosyaları şurada yaz: ikincil depolama birimleri Android 11 için tek bir yaklaşım kullanın. Android'in önceki sürümleri için farklı bir yaklaşım kullanın.
Eski dosyadaki mevcut dosyaları taşıma depolama alanı konumu Mümkün olduğunda dosyalarınızı kapsamlı depolamaya taşıyın. Kapsamın dışında kalmayı seç Android 10 için depolama alanı.
Diğer kullanıcılarla içerik paylaşın uygulamalar Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Medya olmayan dosyaları önbelleğe alma Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Medya olmayan dosyaları bir cihaza dışa aktarma Uygulamanız sınırlı depolama alanı kullanıyorsa tek bir yaklaşım kullanın. Uygulamanız sınırlı depolama alanını devre dışı bırakırsa farklı bir yaklaşım kullanın.

Doküman dosyasını açma

ACTION_OPEN_DOCUMENT'ı kullanma kullanıcının sistem seçiciyi kullanarak açılacak bir dosyayı seçmesini isteme. Sistem seçicinin kullanıcıya sunacağı dosya türlerini filtrelemek istiyorsanız setType() veya EXTRA_MIME_TYPES seçeneğini kullanabilirsiniz.

Örneğin, aşağıdaki kodu kullanarak tüm PDF, ODT ve TXT dosyalarını bulabilirsiniz:

KotlinJava
startActivityForResult(
        Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            type = "*/*"
            putExtra(Intent.EXTRA_MIME_TYPES, arrayOf(
                    "application/pdf", // .pdf
                    "application/vnd.oasis.opendocument.text", // .odt
                    "text/plain" // .txt
            ))
        },
        REQUEST_CODE
      )
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {
                "application/pdf", // .pdf
                "application/vnd.oasis.opendocument.text", // .odt
                "text/plain" // .txt
        });
        startActivityForResult(intent, REQUEST_CODE);

İkincil depolama birimlerindeki dosyalara yazma

İkincil depolama birimleri SD kartları içerir. StorageVolume sınıfını kullanarak belirli bir depolama alanı hacmi hakkındaki bilgilere erişebilirsiniz.

Uygulamanızın çalıştığı Android sürümüne göre mantık ekleyin.

Android 11'de çalışır

Bu yaklaşımı kullanın:

  1. Kapsamlı depolama modelini kullanın.
  2. Android 10 (API düzeyi 29) veya önceki sürümleri hedefleyin.
  3. WRITE_EXTERNAL_STORAGE iznini beyan edin.
  4. Aşağıdaki erişim türlerinden birini gerçekleştirin:
    • MediaStore API'yi kullanarak dosya erişimi
    • Aşağıdaki gibi API'leri kullanarak doğrudan dosya yolu erişimi File veya fopen().

Eski sürümlerde çalışıyor

Kullanıcıların, uygulamanızın dosyayı yazabileceği ikincil depolama birimi konumunu seçmesine olanak tanıyan Depolama Alanı Erişim Çerçevesi'ni kullanın.

Eski depolama konumundaki mevcut dosyaları taşıma

Bir dizin eski depolama konumu olarak kabul edilir ( uygulamaya özel bir dizin veya herkese açık bir paylaşılan dizin). Uygulamanız konumdaki dosyaları kullanıyorsa, verilerinizi Google Haritalar'a taşımak için uygulamanızın dosyalarını kapsamlı depolama alanıyla erişilebilen konumlara belirlenen depolama alanındaki dosyalarla çalışmak için gerekli uygulama değişikliklerini gözden geçirin.

Veri taşıma için eski depolama alanına erişimi sürdürme

Uygulamanızın şunu yapmak için eski depolama konumuna erişimi olması gerekir: tüm uygulama dosyalarını, kapsamlı depolama alanıyla erişilebilen konumlara taşıma Kullanmanız gereken yaklaşım, uygulamanızın hedef API düzeyine bağlıdır.

Uygulamanız Android 11'i hedefliyorsa
  1. Ayarlayın: preserveLegacyExternalStorage eski depolama alanını korumak için true olarak işaretle modeli kullanır. Yeni sürüme geçtiklerinde uygulamanızın kullanıcı verilerini taşıyabileceğini Android 11'i hedefleyen uygulamalar.

  2. Kapsamlı depolama alanını devre dışı bırakma işlemine devam edin. uygulamanız şurada eski depolama konumundaki dosyalarınıza erişmeye devam edebilir: Android 10 cihazlar.

Uygulamanız Android 10'u hedefliyorsa

Uygulamanızın davranışını Android sürümleri arasında tutarlı tutmak için kapsamlı depolama alanını devre dışı bırakın.

Uygulama verilerini taşıma

Uygulamanız taşınmaya hazır olduğunda aşağıdaki yaklaşımı kullanın:

  1. Android 10 veya önceki sürümleri hedefleyin.
  2. Kapsamlı depolama alanını devre dışı bırak uygulamanız, taşımanız gereken dosyalara erişebiliyor.
  3. Sunucudan dosya taşımak için File API'yi kullanan bir kod dağıtın /sdcard/ altındaki mevcut konumu erişilebilir bir konuma taşıyın (kapsamlı depolama alanında):

    1. Gizli uygulama dosyalarını getExternalFilesDir() yöntemi tarafından döndürülen dizin içine taşıyın.
    2. Medya dışı paylaşılan dosyaları Downloads/ dizininin uygulamaya özel bir alt dizinine taşıyın.
  4. Uygulamanızın eski depolama alanı dizinlerini /sdcard/ dizininden kaldırın.

Kullanıcılar, uygulamanızın yeni sürümünü yükledikten sonra cihazlarında veri taşıma işlemini tamamlar. Bir analiz etkinliği oluşturarak kullanıcı tabanınızdaki taşıma sürecini izleyebilirsiniz.

Kullanıcılar verilerini taşıdıktan sonra uygulamanızda Android 11'i hedeflediğiniz başka bir güncelleme yayınlayın.

Diğer uygulamalarla içerik paylaşma

Uygulamanızın dosyalarını tek bir başka uygulamayla paylaşmak için bir FileProvider değerleridir. Tümünün dosyalarını birbirine paylaşması gereken uygulamalar için her uygulamada bir içerik sağlayıcı kullanmanızı ve ardından uygulamalar koleksiyona eklendikçe verileri senkronize etmenizi öneririz.

Medya dışı dosyaları önbelleğe alma

Kullanmanız gereken yaklaşım, ihtiyacınız olan dosyaların türüne bağlıdır geri yükleyebilirsiniz.

Medya dışı dosyaları bir cihaza aktarın

Medya dışı içerikleri depolamak için uygun bir varsayılan konum belirleyin dosyası olarak da kaydedebilir. Kullanıcıların uygulamaya özgü dizinlerdeki dosyaları daha genel erişilebilir bir konuma aktarmasına izin verin. Medya dışı dosyaları cihaza aktarmak için MediaStore'un indirilenler veya doküman koleksiyonlarını kullanın.

Uygulamaya özgü dosyaları işleme

Uygulamanız, diğer uygulamaların erişmesi gerekmeyen dosyalar oluşturuyorsa veya erişimi olması gerektiği için bu dosyaları uygulamaya özel depolama konumları.

Dahili depolama alanı dizinleri

Sistem, diğer uygulamaların bu konumlara erişmesini engeller ve Android 10 (API düzeyi 29) ve sonraki sürümlerde bu konumlar şifrelenir. Bu konumlar yalnızca uygulamanızın erişebileceği hassas verileri depolamak için iyi bir yerdir.

Harici depolama alanı dizinleri

Dahili depolama alanı, uygulamaya özgü dosyaları depolamak için yeterli alan sağlamıyorsa bunun yerine harici depolama alanı kullanabilirsiniz. Her ne kadar bazı durumlarda bu dizinlere erişmek için Söz konusu uygulama uygun izinlere sahipse bu dizinlerde depolanan dosyalar yalnızca uygulamanız tarafından kullanılmalıdır.

Android 4.4 (API düzeyi 19) veya sonraki sürümlerde uygulamanızın harici dizinlerdeki uygulamaya özel dizinlere erişmek için depolama alanıyla ilgili izinler depolama alanına sahip olursunuz.

Kullanıcı uygulamanızı kaldırdığında uygulamaya özel depolama alanına kaydedilen dosyalar kaldırılır. Bu nedenle, kullanıcının uygulamanızdan bağımsız olarak kalmasını beklediği hiçbir şeyi kaydetmek için bu depolama alanını kullanmamalısınız.

Kapsamlı depolama alanını geçici olarak devre dışı bırakma

Uygulamanız, kapsamlı depolama alanıyla tam olarak uyumlu olmadan önce geçici olarak şunları etkinleştirebilirsiniz: hem testlerinizde hem de üretiminizde uygulamasını indirin.

Testlerinize katılma

Android 10 (API düzeyi 29) ve sonraki sürümlerde uygulamanızın testleri varsayılan olarak bir depolama korumalı alanında çalışır. Bu korumalı alan, uygulamanızın dışarıdaki dosyalara erişmesini engeller dizinlerin ve herkese açık olarak paylaşılan dizinlerin listesini içerir.

Bir test, ana makine için dosya çıktısı verirse (ör. ekran görüntüleri, hata ayıklama verileri, veya performans metrikleri gibi), bu dosyaları tüm Google çalışanlarından dizin oluşturabilirsiniz. Bunu yapmak için am instrument'ü çağıran ilgili donanıma aşağıdaki işareti ekleyin:

-e no-isolated-storage 1

Bu işaret, araçlı test durumunun tüm davranışlarını etkiler ve test kodu çağırıldı. Dolayısıyla bu işareti kullandığınızda uygulamanızın kapsamlı depolama ile uyumluluğu. Bunun yerine test çıkışı için kabuk tarafından okunabilen uygulama kapsamlı depolama alanına yazma Bu verileri uygulama kapsamlı bir dizindir. Hangi dizinden alınacağını belirlemek için şunu çağırın: getExternalMediaDirs().

Üretim uygulamanızda devre dışı bırakma

Uygulamanız Android 10 (API düzeyi 29) veya önceki sürümleri hedefliyorsa geçici olarak üretim uygulamanızdaki kapsam dışında kalan depolama alanı. Şunu hedeflerseniz: Ancak Android 10'da Uygulamanızın manifest dosyasında requestLegacyExternalStorage to true parametresi:

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting
       Android 10. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

Android 10 veya önceki sürümleri hedefleyen bir uygulamanın, seçeneğini tercih ederseniz requestLegacyExternalStorage - false. Android 11 çalıştıran bir cihazda test yapıyorsanız uygulamanızın kapsamlı depolama alanı ile veya kapsamlı depolama alanı olmadan davranışını test etmek için uygulama uyumluluk işaretlerini de kullanabilirsiniz.

Ek kaynaklar

Android depolama alanı hakkında daha fazla bilgi edinmek için aşağıdaki materyalleri görüntüleyin:

Blog yayınları