Internal Storage vs External Storage
Internal Storage
- Her zaman erişilebilir.
- Sadece uygulamanın kendisi tarafından erişebilir. Buraya kaydedilen dosyalar başka bir uygulama tarafından görünmez. USB ile bilgisayara bağlanıldığında bu dosyalara erişim sağlanamaz.
- Uygulama silindiğinde internal storage temizlenir.
External Storage
- Her zaman erişilebilir durumda olmayabilir. External storage cihaza dahili olarak bulunabileceği gibi USB cihazı olarak sonradan takılmış bir cihaz da olabilir. Bu nedenle erişebilir olup olmadığı kontrol edilmelidir (
getExternalStorageState()
). - External Storage’a kayıt edilen dosyalar başka uygulamalar tarafından okunabilir ve görülebilir durumda olabilir. Oluşturma şekline göre farklılık gösterir.
Environment.getExternalStorageDir()
ile belirtilen klasöre kayıt edilen dosyalar tüm uygulamalar tarafından erişilebilir ve değiştirilebilir.Context.getExternalFilesDir()
ile belirtilen klasöre kayıt edilen dosyalar yalnızca uygulamanın kendisi tarafından görülebilir ve değiştirilebilir. Fakat cihaz usb ile bilgisayara bağlandığında bu dosyalar internal storage‘a kaydedilen dosyaların aksine erişilebilir olacaktır.
Context.getExternalFilesDir()
ile ulaşılan path’e kayıt edilen dosyalar uygulama silindiğinde otomatik olarak temizlenir.
getFilesDir()
-> /data/user/0/com.aykuttasil.myapp/filesgetExternalFilesDir(Environment.DIRECTORY_DCIM)
-> /storage/emulated/0/Android/data/com.aykuttasil.myapp/files/DCIMgetExternalCacheDir()
-> /storage/emulated/0/Android/data/com.aykuttasil.myapp/cacheEnvironment.getExternalStorageDirectory()
-> /storage/emulated/0Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
-> /storage/emulated/0/DCIM
Environment.getExternalStorageDirectory()
Android Q ve sonrasını hedefleyen uygulamalar için bu fonksiyon deprecated olmuştur. getExternalStorageDirectory()
External kelimesi kafa karıştırıcı olabiliyor. Çoğu zaman için bu alan SD kartı ifade eder fakat android cihazların çok büyük bir kısmında dahili olarak external için ayrılmış alan bulunur.
Bir cihazda birden fazla external hafızayı temsil eden alan var ise bu alanlara ContextCompat.getExternalFilesDirs(this,null);
şeklinde erişilebilir. Android 4.4 (19) öncesi ve sonrasında bu dizine erişim farklılık gösterdiği için ContextCompat sınıfı bize yardımcı olur.