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:
- Uygulama İzinleri İsteme bölümünde belirtilen en iyi uygulamalara uyarak
READ_EXTERNAL_STORAGE
iznini isteyin. - Ş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:
- Kullanıcıların, uygulamaya özel depolama alanı veya paylaşılan depolama alanı kullanarak medya dosyalarını diğer uygulamalar tarafından okunabilir hale getirip getirmeyeceklerini seçmelerine izin verin.
- 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ı cihazın galerisine aktarmak için MediaStore'un resim, video ve ses koleksiyonlarını kullanın.
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:
MediaStore.createWriteRequest()
veyaMediaStore.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.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:
- Uygulama İzinleri İsteme bölümünde belirtilen en iyi uygulamalara uyarak
WRITE_EXTERNAL_STORAGE
iznine başvurun. - 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:
- Uygulama İzinleri İsteme bölümünde açıklanan en iyi uygulamaları izleyerek
READ_EXTERNAL_STORAGE
için istekte bulunabilirsiniz izni gerekir. - Medya koleksiyonunu sorgulamak için
query()
API'yi kullanın. - 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:
- 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ümleri çalıştıran cihazlar
Ş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ş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:
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:
- Kapsamlı depolama modelini kullanın.
- Android 10 (API düzeyi 29) veya önceki sürümleri hedefleyin.
WRITE_EXTERNAL_STORAGE
iznini beyan edin.- 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
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
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
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:
- 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.
-
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):- Gizli uygulama dosyalarını
getExternalFilesDir()
yöntemi tarafından döndürülen dizin içine taşıyın. - Medya dışı paylaşılan dosyaları
Downloads/
dizininin uygulamaya özel bir alt dizinine taşıyın.
- Gizli uygulama dosyalarını
- 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.
- Hassas bilgiler içeren küçük dosyalar veya dosyalar:
Context#getCacheDir()
. - Büyük dosyalar veya hassas bilgiler içermeyen dosyalar:
Context#getExternalCacheDir()
seçeneğini kullanın.
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: