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:
- Uygulama İzinleri İsteme bölümünde açıklanan en iyi uygulamaları izleyerek
READ_EXTERNAL_STORAGE
için istekte bulunabilirsiniz izni gerekir. - Ş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:
- Kullanıcıların, medya dosyalarının diğer uygulamalar tarafından okunabilir olmasını isteyip istemediklerini seçmelerine izin ver uygulamaya özel depolama alanı veya paylaşılan depolama alanı kullanılıyor olabilir.
- 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 dosyalarını dışa aktarmak için MediaStore'un resim, video ve ses koleksiyonlarını kullanın cihazın galerisinde.
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:
- Uygulamanızın yazma veya silme isteği için bekleyen intent oluşturmak için şunu kullanın:
MediaStore.createWriteRequest()
veyaMediaStore.createTrashRequest()
ve daha sonra, bu komut dosyasını çağırarak bu dosyayı isteyebilirsiniz. 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:
- Uygulama İzinleri İsteme bölümünde açıklanan en iyi uygulamaları izleyerek
WRITE_EXTERNAL_STORAGE
için istekte bulunabilirsiniz izni gerekir. - 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:
- Uygulama İzinleri İsteme bölümünde açıklanan en iyi uygulamaları izleyerek
READ_EXTERNAL_STORAGE
için istekte bulunabilirsiniz izni gerekir. query()
'ı kullanma Medya koleksiyonunu sorgulama API'si.- 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:
- Uygulama İzinleri İsteme bölümünde açıklanan en iyi uygulamaları izleyerek
READ_EXTERNAL_STORAGE
için istekte bulunabilirsiniz izni gerekir. - 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:
- Uygulama İzinleri İsteme bölümünde açıklanan en iyi uygulamaları izleyerek
WRITE_EXTERNAL_STORAGE
için istekte bulunabilirsiniz izni gerekir. - 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:
- Kapsamlı depolama modelini kullanın.
- Android 10 (API düzeyi 29) veya önceki sürümleri hedefleyin.
- Tanımlayın
WRITE_EXTERNAL_STORAGE
izni gerekir. - 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
veyafopen()
.
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
Ayarlayın:
preserveLegacyExternalStorage
eski depolama alanını korumak içintrue
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.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:
- Android 10 veya önceki sürümleri hedefleyin.
- Kapsamlı depolama alanını devre dışı bırak uygulamanız, taşımanız gereken dosyalara erişebiliyor.
-
Dosyaları
File
/sdcard/
altındaki mevcut konumu erişilebilir bir konuma taşıyın (kapsamlı depolama alanında):- Tüm gizli uygulama dosyalarını
getExternalFilesDir()
yöntemidir. - Paylaşılan tüm medya dışı dosyaları şu uygulamaya özel alt dizine taşıyın:
Downloads/
dizini.
- Tüm gizli uygulama dosyalarını
- 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.
- Hassas bilgiler içeren küçük dosyalar veya dosyalar:
Context#getCacheDir()
. - Hassas bilgi içermeyen büyük dosyalar veya dosyalar:
Context#getExternalCacheDir()
.
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: