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

Kullanıcılara dosyaları üzerinde daha fazla kontrol sunmak ve dosya karmaşıklığını azaltmak için Android 10, uygulamalar için yeni bir depolama alanı paradigmasını kullanıma sundu. kapsamlı depolama alanı. Kapsamlı depolama alanı değişiklikleri uygulamaların, cihazın harici depolama alanındaki dosyaları depolama ve dosyalara erişme biçimi. Size yardımcı olmak için uygulamanızı tam kapsamlı depolamayı destekleyecek şekilde depolama alanı kullanım alanlarına ve depolama alanına özgüdür. Kullanım alanları düzenli bir şekilde iki kategoriye ayrılır: medya dosyalarının işlenmesi ve işleme. medya dışı dosyalara erişebilir.

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ı işleme ile ilgili yaygın kullanım alanlarından bazıları açıklanmaktadır (video, resim ve ses dosyaları) anlatır ve müşterinizin hedef kitlenizin kullanabileceğiniz en iyi uygulamadır. Aşağıdaki tabloda bu kullanım alanlarının her biri ve bağlantılar özetlenmiştir. her bir bölüme geçebilirsiniz.

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 yerden resimleri veya videoları gösterin klasör Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Konum bilgilerine şuradan erişin: fotoğraflar Uygulamanız kapsamlı depolama alanı kullanıyorsa şu yaklaşımlardan birini kullanın. Farklı bir bu yaklaşıma başvurmanız gerekir.
Yeni indirilenler için depolama konumunu tanımlama Uygulamanız kapsamlı depolama alanı kullanıyorsa şu yaklaşımlardan birini kullanın. Farklı bir bu yaklaşıma başvurmanız gerekir.
Kullanıcı medya dosyalarını 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'da kapsam dışında kalmayı seçme ve Android 9 ve önceki sürümler için yaklaşımı kullanın.
Zaten mevcut Android'in tüm sürümleri için aynı yaklaşımı kullanın.
Tek bir 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.
Dosyalara koddan veya kitaplıklardan erişme Doğrudan dosya yollarını kullananlar Android 11 için tek bir yaklaşım kullanın. Android 10'da kapsam dışında kalmayı seçme ve Android 9 ve önceki sürümler için yaklaşımı kullanın.

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

Medya koleksiyonunu sorgulama query() API'ye gidin. Medya dosyalarını filtrelemek veya sıralamak için projection, selection, selectionArgs ve sortOrder parametreleri.

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

Ş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. Ş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ütununda 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. Sürekli iyileştirmeyle uğraşmaya dosya tabanlı G/Ç hataları var.

Diğer yandan, bir medya dosyası oluşturmak veya güncellemek için DATA sütunu. Bunun yerine, DISPLAY_NAME ve RELATIVE_PATH sütun.

Fotoğraflardan konum bilgilerine erişme

Uygulamanız kapsamlı depolama alanı kullanıyorsa şuradaki adımları uygulayın: Konum bilgileri fotoğraflarda bölümüne bakın.

Yeni indirilenler için depolama konumunu tanımlayın

Uygulamanız, kapsamlı depolama alanı kullanıyorsa kapsama almayı tercih ettiğiniz konuma dikkat edin. indirdiğiniz medya dosyalarını depolayın.

Diğer uygulamaların dosyalara erişmesi gerekiyorsa iyi tanımlanmış medyaları kullanabilirsiniz. koleksiyonlar'ı seçin.

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 kapalıdır. getirmemiz gerekiyor.

Kullanıcının medya dosyalarını cihaza aktarın

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

ziyaret edin.

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'de yüklü olmalıdır.

Şu yaklaşımı kullanın:

  1. Uygulamanızın yazma veya silme isteği için bekleyen intent oluşturmak için şunu kullanın: MediaStore.createWriteRequest() veya MediaStore.createTrashRequest() ve daha sonra, bu komut dosyasını çağırarak bu dosyayı isteyebilirsiniz.
  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.

Medya gruplarını yönetme hakkında daha fazla bilgi edinin: dosyalarınızı yöntemlerine göz atın.

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ümlerde çalışan

Ş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. Değişiklik yapmak için MediaStore API'yi kullanın veya medya dosyalarını silebilirsiniz.

Mevcut tek bir resmi içe aktarın

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. query()'ı kullanma Medya koleksiyonunu sorgulama API'si.
  3. Sonuçları uygulamanızın özel kullanıcı arayüzünde görüntüleyin.

Sistem seçiciyi kullanın

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 bkz. Öğe ekleyin medya depolama rehberini inceleyin.

Medya dosyalarını belirli bir uygulamayla paylaşma

Android FileProvider bileşenini Kurulum dosyası oluşturmada açıklandığı gibi kullanın paylaşma rehberini inceleyin.

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ığı dahil edin.

Android 11'de yüklü olmalıdır.

Ş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. 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ümlerde çalışan

Ş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şin.

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 tablo bu kullanım alanlarının her birini özetler ve unutmayın.

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. Önceki konuşmalar için farklı bir yaklaşım kullanın: Android'in sürümleri.
Eski dosyadaki mevcut dosyaları taşıma depolama alanı konumu Mümkün olduğunda dosyalarınızı kapsamlı depolama alanına taşıyın. Kapsamın dışında kalmayı seçin 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 kapsamlı depolama alanı kullanıyorsa şu yaklaşımlardan birini kullanın. Farklı bir bu yaklaşıma başvurmanız gerekir.

Doküman dosyası açma

ACTION_OPEN_DOCUMENT'ı kullanma kullanıcının sistem seçiciyi kullanarak açılacak bir dosyayı seçmesini isteme. Şu durumda: sistem seçicinin kullanabileceğiniz başka bir araç var. setType() veya EXTRA_MIME_TYPES.

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

Kotlin

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
      )

Java

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 birimlerine SD kartlar dahildir. Bir web sitesi ile ilgili kullanarak verilen depolama hacmini StorageVolume sınıfı.

Uygulamanızın çalıştığı Android sürümüne dayalı mantığı dahil edin.

Android 11'de çalışır

Şu yaklaşımı kullanın:

  1. Kapsamlı depolama modelini kullanın.
  2. Android 10 (API düzeyi 29) veya önceki sürümleri hedefleyin.
  3. Tanımlayın WRITE_EXTERNAL_STORAGE izni gerekir.
  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

Şu seçeneği kullanın: Depolama Erişimi Çerçeve'yi kullanabilirsiniz. uygulamanızın veri yazabileceği ikincil depolama biriminde konumu seçin dosyası olarak kaydedebilirsiniz.

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 konumuna erişimi sürdür

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 İlgili içeriği oluşturmak için kullanılan 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

Kapsamlı depolamayı devre dışı bırakarak Uygulamanızın Android sürümlerinde davranışını koruması.

Uygulama verilerini taşı

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. DosyalarıFile /sdcard/ altındaki mevcut konumu erişilebilir bir konuma taşıyın (kapsamlı depolama alanında):

    1. Tüm gizli uygulama dosyalarını getExternalFilesDir() yöntemidir.
    2. Paylaşılan tüm medya dışı dosyaları şu uygulamaya özel alt dizine taşıyın: Downloads/ dizini.
  4. Uygulamanızın eski depolama dizinlerini şuradan kaldırın: /sdcard/ dizini.

Kullanıcılar uygulamanızın yeni sürümünü yükledikten sonra verileri tamamlarlar cihazlarında bu özelliği kullanmaya devam edebilir. Taşıma sürecini kullanıcı tabanınızı genişletmek için kullanabileceğiniz bir araçtır.

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

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. Herkesin paylaşması gereken uygulamalar için oluşturmak için bir dosya içeriğini kullanarak sağlayıcıyı ve her uygulama için uygulamalar koleksiyona eklendikçe verileri senkronize eder.

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

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 şuradan dosya dışa aktarmasına izin ver: uygulamaya özel dizinleri daha genel olarak erişilebilir bir konuma yönlendirin. Medya dışı dosyaları dışa aktarmak için MediaStore'un indirme veya doküman koleksiyonlarını kullanın için geçerlidir.

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

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 bir depolama alanında çalışır varsayılan olarak korumalıdı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 aşağıdaki işaretleyiciyi ilgili am instrument öğesini çağırır:

-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. Aşağıdaki özelliklere sahip bir cihazda test ediyorsanız: Android 11 yüklüyse uygulama uyumluluğunu da kullanabilirsiniz işaretini test etmek için uygulamanın davranışını kapsamlı bir şekilde anlamanıza yardımcı olabilir.

Ek kaynaklar

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

Blog yayınları