GetExternalFilesDir ve getExternalStorageDirectory () arasındaki fark


90

ExternalFiles'ın API 8 ve üzeri sürümlerde kullanılacağını ve getExternalStorageDirectory'nin 7 ve altı için olduğunu anlıyorum. Ancak kullanım arasında biraz kafam karıştı. Örneğin, var olan bir klasör olup olmadığını kontrol etmek istedim ve daha önce aşağıdakilere benzer bir şey kullanırdınız:

File ChildFolder = new File(Environment.getExternalStorageDirectory() + "/ParentFolder/Child");

Ancak gördüğüm her örnek getExternalFilesDir (null), File.ext kullanmayı söylüyor. API 8'in üzerinde olduğum için bu yöntemi kullanmak istiyorum, ancak bir klasörü nasıl kontrol edebilirim? Başka bir noktada dosya varlığını kontrol edeceğim, ancak şimdilik sadece klasörlerin var olup olmadığını görmek istiyorum ??

Yanıtlar:


133
getExternalFilesDir()

SD kartınızdaki Android / data / data / your_package / içindeki dosyalar klasörünün yolunu döndürür . Uygulamanız için gerekli tüm dosyaları saklamak için kullanılır (örn. Web'den veya önbellek dosyalarından indirilen resimler). Uygulama kaldırıldıktan sonra, bu klasörde depolanan tüm veriler de silinir.

getExternalStorageDirectory()

Kök yolunu SD kartınıza döndürür (örn. Mnt / sdcard / ). Bu yola veri kaydedip uygulamayı kaldırırsanız, bu veriler kaybolmaz.


4
Google Android, çerçeve içinde sağladıkları her şeyi kullanmanızı istiyor. Yani seçiminize ve tasarım gereksinimlerinize bağlıdır. Uygulama kaldırıldığında dosyaların solda kalmasını istemiyorsanız, getExternalFilesDir () veya getExternalCacheDir ()
waqaslam

5
Bunun nedeni, API 8'de müzik, resim, zil sesleri vb. Klasörlerdeki verileri taramaya izin veren gelişmiş medya tarayıcı özelliklerini sunmuşlardır . Bu dizinler yalnızca getExternalFilesDir () kullanırsanız otomatik olarak oluşturulur . Şimdi bu özellik API 7'de bulunmadığından, getExternalStorageDirectory () ' yi kullanmaları önerildi . Simple ...
waqaslam

2
Tamam, biraz zaman ver, yakında bir eureka anı olacak :)
waqaslam

3
O bilmek önemlidir getExternalStorageDirectory()gelmez ille değil hatta belki - genellikle - "SD kart yolunu" return Bunun yerine "birincil harici depolama dizinini" döndürür. Dokümanlar ( developer.android.com/reference/android/os/… ) şöyle diyor:
LarsH

2
'Not: Burada "harici" kelimesiyle kafanızı karıştırmayın. Bu dizin daha çok medya / paylaşılan depolama alanı olarak düşünülebilir. Nispeten büyük miktarda veriyi tutabilen ve tüm uygulamalar arasında paylaşılan (izinleri zorlamayan) bir dosya sistemidir. Geleneksel olarak bu bir SD karttır , ancak aynı zamanda korumalı dahili depolamadan farklı olan ve bir bilgisayara dosya sistemi olarak bağlanabilen bir cihazda yerleşik depolama olarak da uygulanabilir. '
LarsH

70

Her şeyden önce, Dahili Depolama, Harici Depolama (diğer adıyla birincil harici depolama) ve İkincil Harici Depolama arasındaki farkın ne olduğunu anlamamız gerekir.

Dahili Depolama: yüklü uygulamalar (veya cihazlarını köklendirme) dışında kullanıcı tarafından erişilemeyen depolamadır. Örnek: data / data / app_packageName

Birincil Harici Depolama: "Kullanıcı tarafından bir USB kablosu takılarak ve bir ana bilgisayarda bir sürücü olarak takılarak erişilebilen" yerleşik paylaşılan depolamada. Örnek: Nexus 5 32 GB dediğimizde.

İkincil Harici Depolama: Çıkarılabilir depolama. Örnek: SD Kart.

getExternalFilesDir (String type)

Android / data / data / your_package / birincil harici depolamadaki dosyalar klasörünün yolunu döndürür. Dahili depolamadır.

Environment.getExternalStorageDirectory(type)

İkincil harici depolama dizininin yolunu döndürür


Farklı depolama türlerini açıkladığınız için teşekkür ederiz. Ancak, bu değeri almak için yöntem çağrısının getFilesDir () olduğunu belirtmek için dahili depolama öğesini düzenleyebilirsiniz . Sanırım bu yöntem aslında data / data / app_packageName / files döndürüyor ama yine de dahili depolamadır.
raddevus

3
@VicJordan Lütfen File getExternalStoragePublicDirectory (String type)ve File getFilesDir ()bunun hakkında yazın
AnV

2
Teşekkürler Vic. Environment.getExternalStorageDirectory () outputs / storage / emulated / 0
gimmegimme

Birincil harici depolamanın her zaman yerleşik olduğunu, ancak ikincil depolamanın her zaman çıkarılabilir olduğunu belirten herhangi bir belgeniz var mı? Bunların bağımsız sorunlar olduğunu düşündüm ... bazı telefonlarda yerleşik "harici" depolama yoktur, bu durumda birincil harici depolama birimi çıkarılabilir SD kart olabilir.
LarsH

@LarsH, bildiğim kadarıyla şu anda piyasada telefon yok veya yakın gelecekte yerleşik birincil harici depolama alanı olmayacak. Gingerbread zamanında bu tür telefonlar varken telefonlar vardı ama şimdi değil. Yerleşik "birincil harici depolama birimi" olmayan "bazı" telefonları adlandırır mısınız?
Vikasdeep Singh

18

! ÖNEMLİ GÜNCELLEME! bu soruya kim rastlarsa onu alsın.

Bu biraz eski bir soru olduğu için sadece bazı ek bilgiler sağlamak istedim. Var KitKat hatta uygulamalar yana WRITE_EXTERNAL_STORAGE izni olan yalnızca izin için yazma için Android / data / data / your_package / Harici depolama biriminde, diğer adıyla getExternalFilesDir()

Size yazmaya çalışırsanız getExternalStorageDirectory() + "/somefolder/anotherfolder/", çoğu cihazda bir Güvenlik İstisnası alacaksınız.


9
Dokümanlara göre, WRITE_EXTERNAL_STORAGE iznine sahip uygulamalar, yalnızca kendi paketlerine değil, diğer paketlerin harici depolamasına da yazabilir. Yalnızca kendi dizinlerine yazabilen izne sahip OLMAYAN uygulamalardır: developer.android.com/reference/android/content/… "KITKAT'tan itibaren, döndürülen yolu okumak veya yazmak için herhangi bir izin gerekmez; her zaman çağıran uygulama tarafından erişilebilir ... Diğer paketlere ait yollara erişmek için, WRITE_EXTERNAL_STORAGE ve / veya READ_EXTERNAL_STORAGE gereklidir. "
Oded

Android dokümanları fikri genelleştirirken "çoğu cihazda" önemli olmaya başladığı yer burasıdır, ancak üreticilerin bazen InternalStorage (uygulama verileri için yerleşik depolama), ExternalStorage-Primary ( ayrıca daha büyük erişim kapsamına sahip yerleşik depolama ) gibi şeyler vardır. ve ExternalStorage-Secondary (bu, SD kartlar gibi monte edilmiş şeyler olacaktır). Şimdi, Harici Depolama Dizini'nin hangi yolu döndürdüğünü tahmin edebilirsiniz
SGal

7
Bu, cevabınızdaki yanlış bilgileri ele almıyor. "KitKat'tan beri WRITE_EXTERNAL_STORAGE iznine sahip uygulamaların bile yalnızca Android / data / data / your_package / harici depolama, yani getExternalFilesDir () üzerine yazmasına izin verilmektedir." Dokümanlara göre bu yanlış. WRITE_EXTERNAL_STORAGE ile uygulamalar tüm harici depolamaya yazabilir.
Oded

1
@Oded, bunu test ettiniz mi? Belgelerle ilgili anlayışım ve KitKat ve sonraki cihazlarla ilgili deneyimim sizinkilerden farklı. (Keşke şimdi tüm detayları gözden geçirmek için zamanım olsaydı. Belki sonra.) Benim deneyimim, SGal'ın haklı olduğu. Sonra biraz farklı olan Lollipop da var.
LarsH

2
Android'in belgelerine göre bu cevap açıkça yanlış. Bkz developer.android.com/reference/android/... "API düzeyinde 19 yılından itibaren bu izin getExternalFilesDir (String) ve getExternalCacheDir () tarafından döndürülen Uygulamaya özel dizinlerde / yazma dosyalarını okumak için gerekli değildir." (API seviyesi 19 = KitKat olduğunu unutmayın.) Nasıl bu kadar çok oy aldığına dair hiçbir fikrim yok.
Ajedi32

7

!! ÖNEMLİ !!

Environment.getExternalStorageDirectory()kullanımdan kaldırılmıştır ve bunun yerine Bağlam # getExternalFilesDir (String), MediaStore veya Intent # ACTION_OPEN_DOCUMENT kullanılmalıdır.

Bu yöntem, API seviyesi 29'da kullanımdan kaldırılmıştır. Kullanıcı gizliliğini geliştirmek için, paylaşılan / harici depolama cihazlarına doğrudan erişim kullanımdan kaldırılmıştır. Bir uygulama Build.VERSION_CODES.Q öğesini hedeflediğinde, bu yöntemden döndürülen yola artık uygulamalar tarafından doğrudan erişilemez. Uygulamalar, Context # getExternalFilesDir (String), MediaStore veya Intent # ACTION_OPEN_DOCUMENT gibi alternatiflere geçerek paylaşılan / harici depolama alanında depolanan içeriğe erişmeye devam edebilir.

https://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory ()

Ayrıca Android.M geliştiricilerinin çalışma zamanında izin istemeleri gerekir.

Belgelerde daha fazla ayrıntıya buradan ve bu soruya bakın

Environment.getExternalStorageDirectory () API seviyesi 29 java'da kullanımdan kaldırıldı


birisi yığın taşma bağlantısı arıyor ve kopyası google dokümanlarından yapıştırılmıyorsa buraya bakın stackoverflow.com/questions/57116335/…
Rowan Berry

1
Android 11'den itibaren uygulamalar, harici depolamada kendi uygulamaya özel dizinlerini oluşturamaz.
Darksymphony
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.