Aracılığıyla paylaş


Dış depolama alanı

Dış depolama, dahili depolamada olmayan ve yalnızca dosyadan sorumlu uygulama tarafından erişilmeyen dosya depolamayı ifade eder. Dış depolamanın birincil amacı, uygulamalar arasında paylaşılacak veya iç depolamaya sığamayacak kadar büyük dosyaları yerleştirebileceğiniz bir yer sağlamaktır.

Geçmişe dönük olarak belirtmek gerekirse, dış depolama, SD kart gibi çıkarılabilir medyalardaki bir disk bölümüne başvuruyordu (taşınabilir depolama olarak da bilinirdi). Android cihazlar geliştikçe ve birçok Android cihazı artık çıkarılabilir depolamayı desteklemediğinden bu ayrım artık geçerli değildir. Bunun yerine bazı cihazlar, dahili geçici olmayan belleklerinin bir kısmını Çıkarılabilir medya ile aynı işlevi gerçekleştirebilen Android'e ayırır. Bu, öykünülmüş depolama olarak bilinir ve yine de dış depolama olarak kabul edilir. Alternatif olarak, bazı Android cihazlarda birden çok dış depolama bölümü olabilir. Örneğin, bir Android tablette (dahili depolama alanına ek olarak) öykünmüş depolama alanı ve SD kart için bir veya daha fazla yuva olabilir. Bu bölümlerin tümü Android tarafından dış depolama alanı olarak değerlendirilir.

Birden çok kullanıcısı olan cihazlarda, her kullanıcının dış depolama alanı için birincil dış depolama bölümünde ayrılmış bir dizini olur. Bir kullanıcı olarak çalışan uygulamaların cihazdaki başka bir kullanıcıdan gelen dosyalara erişimi olmaz. Tüm kullanıcılar için dosyalar hala dünya tarafından okunabilir ve dünya tarafından yazılabilir; ancak Android, diğer kullanıcıların her kullanıcı profilini korumalı alana alır.

Xamarin.Android'de okuma ve dosyalara yazma, diğer tüm .NET uygulamalarıyla olduğu gibi neredeyse aynıdır. Xamarin.Android uygulaması, işlenecek dosyanın yolunu belirler ve ardından dosya erişimi için standart .NET deyimlerini kullanır. İç ve dış depolamanın gerçek yolları cihazdan cihaza veya Android sürümünden Android sürümüne farklılık gösterebileceğinden, dosyaların yolunu sabit olarak kodlayabilirsiniz. Bunun yerine Xamarin.Android, iç ve dış depolamadaki dosyaların yolunu belirlemeye yardımcı olacak yerel Android API'lerini kullanıma sunar.

Bu kılavuzda, Android'de dış depolamaya özgü kavramlar ve API'ler ele alınacaktır.

Dış depolamada genel ve özel dosyalar

Bir uygulamanın dış depolamada tutabileceği iki farklı dosya türü vardır:

  • Özel dosyalar – Özel dosyalar, uygulamanıza özgü dosyalardır (ancak yine de dünya tarafından okunabilir ve dünya yazılabilir dosyalardır). Android, özel dosyaların dış depolamadaki belirli bir dizinde depolanmasını bekler. Dosyalar "özel" olarak adlandırılsa da, cihazdaki diğer uygulamalar tarafından hala görünür ve erişilebilir durumda olsalar da, Android tarafından özel koruma sağlanmıyor.

  • Genel dosyalar – Bunlar uygulamaya özgü olarak kabul edilmeyen ve serbestçe paylaşılması amaçlanılan dosyalardır.

Bu dosyalar arasındaki farklar öncelikli olarak kavramsaldır. Özel dosyalar, uygulamanın bir parçası olarak kabul edilmeleri açısından özeldir, genel dosyalar ise dış depolamada bulunan diğer dosyalardır. Android, özel ve genel dosyaların yollarını çözümlemek için iki farklı API sağlar, ancak aksi takdirde bu dosyaları okumak ve bu dosyalara yazmak için aynı .NET API'leri kullanılır. Bunlar, okuma ve yazma bölümünde açıklanan API'ler ile aynıdır.

Özel dış dosyalar

Özel dış dosyalar bir uygulamaya özgü olarak kabul edilir (iç dosyalara benzer) ancak herhangi bir nedenle (iç depolama için çok büyük olması gibi) dış depolamada tutulur. İç dosyalara benzer şekilde, uygulama kullanıcı tarafından kaldırıldığında bu dosyalar silinir.

Özel dış dosyalar için birincil konum, yöntemi Android.Content.Context.GetExternalFilesDir(string type)çağrılarak bulunur. Bu yöntem, uygulama için özel dış depolama dizinini temsil eden bir Java.IO.File nesne döndürür. Bu yönteme geçilmesi null , uygulamanın kullanıcının depolama dizinine giden yolu döndürür. Örneğin, paket adına com.companyname.appsahip bir uygulama için özel dış dosyaların "kök" dizini şöyle olabilir:

/storage/emulated/0/Android/data/com.companyname.app/files/

Bu belge, PRIVATE_EXTERNAL_STORAGE olarak dış depolamadaki özel dosyalar için depolama dizinine başvurur.

parametresiGetExternalFilesDir(), uygulama dizinini belirten bir dizedir. Bu, dosyaların mantıksal bir kuruluşu için standart bir konum sağlamaya yönelik bir dizindir. Dize değerleri, sınıfındaki Android.OS.Environment sabitler aracılığıyla kullanılabilir:

Android.OS.Environment Dizin
DizinAlarms PRIVATE_EXTERNAL_STORAGE/Alarmlar
DirectoryDcim PRIVATE_EXTERNAL_STORAGE/DCIM
Dizinİndirmeler PRIVATE_EXTERNAL_STORAGE/İndir
DirectoryDocuments PRIVATE_EXTERNAL_STORAGE/Belgeler
DirectoryMovies PRIVATE_EXTERNAL_STORAGE/Filmler
DizinMusic PRIVATE_EXTERNAL_STORAGE/Müzik
DirectoryNotifications PRIVATE_EXTERNAL_STORAGE/Bildirimler
DirectoryPodcasts PRIVATE_EXTERNAL_STORAGE/Pod Yayınları
DirectoryRingtones PRIVATE_EXTERNAL_STORAGE/Zil Sesleri
DirectoryPictures PRIVATE_EXTERNAL_STORAGE/Resimler

Birden çok dış depolama bölümü olan cihazlar için her bölümün özel dosyalara yönelik bir dizini olur. yöntemi Android.Content.Context.GetExternalFilesDirs(string type) bir dizisi Java.IO.Filesdöndürür. Her nesne, uygulamanın sahip olduğu dosyaları yerleştirebileceği tüm paylaşılan/dış depolama cihazlarında uygulamaya özgü özel bir dizini temsil eder.

Önemli

Özel dış depolama dizininin tam yolu cihazdan cihaza ve Android sürümleri arasında farklılık gösterebilir. Bu nedenle, uygulamaların bu dizinin yolunu sabit olarak kodlamaması ve bunun yerine gibi Android.Content.Context.GetExternalFilesDir()Xamarin.Android API'lerini kullanmaları gerekir.

Genel dış dosyalar

Genel dosyalar, Android'in özel dosyalar için ayırdığı dizinde depolanmayan dış depolamada bulunan dosyalardır. Uygulama kaldırıldığında ortak dosyalar silinmez. Genel dosyaları okuyabilmesi veya yazabilmesi için Android uygulamalarına izin verilmesi gerekir. Genel dosyaların dış depolamada herhangi bir yerde bulunması mümkündür, ancak kural gereği Android, özelliği Android.OS.Environment.ExternalStorageDirectorytarafından tanımlanan dizinde genel dosyaların mevcut olmasını bekler. Bu özellik, birincil dış depolama dizinini temsil eden bir Java.IO.File nesne döndürür. Örneğin, Android.OS.Environment.ExternalStorageDirectory aşağıdaki dizine başvurabilir:

/storage/emulated/0/

Bu belge, PUBLIC_EXTERNAL_STORAGE olarak dış depolamadaki genel dosyalar için depolama dizinine başvurur.

Android, PUBLIC_EXTERNAL_STORAGE uygulama dizinleri kavramını da destekler. Bu dizinler için uygulama dizinleriyle PRIVATE_EXTERNAL_STORAGE tam olarak aynıdır ve önceki bölümdeki tabloda açıklanmıştır. yöntemi Android.OS.Environment.GetExternalStoragePublicDirectory(string directoryType) , genel uygulama Java.IO.File dizinine karşılık gelen bir nesne döndürür. directoryType parametresi zorunlu bir parametredir ve olamaznull.

Örneğin, çağrı Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDocuments).AbsolutePath aşağıdakine benzer bir dize döndürür:

/storage/emulated/0/Documents

Önemli

Genel dış depolama dizininin tam yolu cihazdan cihaza ve Android sürümleri arasında farklılık gösterebilir. Bu nedenle, uygulamaların bu dizinin yolunu sabit olarak kodlamaması ve bunun yerine gibi Android.OS.Environment.ExternalStorageDirectoryXamarin.Android API'lerini kullanmaları gerekir.

Dış depolama ile çalışma

Xamarin.Android uygulaması bir dosyanın tam yolunu aldıktan sonra, dosyaları oluşturmak, okumak, yazmak veya silmek için standart .NET API'lerinden herhangi birini kullanmalıdır. Bu, bir uygulama için platformlar arası uyumlu kod miktarını en üst düzeye çıkarır. Ancak, bir dosyaya erişmeye çalışmadan önce bir Xamarin.Android uygulamasının bu dosyaya erişmenin mümkün olduğundan emin olması gerekir.

  1. Dış depolamayı doğrulama – Dış depolamanın yapısına bağlı olarak, uygulama tarafından bağlanıp kullanılamayabilir. Tüm uygulamalar, kullanmayı denemeden önce dış depolamanın durumunu denetlemelidir.
  2. Çalışma zamanı izin denetimi gerçekleştirme – Android uygulamasının dış depolama alanına erişmek için kullanıcıdan izin istemesi gerekir. Bu, herhangi bir dosya erişimi öncesinde bir çalışma zamanı izin isteğinin gerçekleştirilmesi gerektiği anlamına gelir. Xamarin.Android'deki İzinler kılavuzu , Android izinleri hakkında daha fazla ayrıntı içerir.

Bu iki görevden her biri aşağıda ele alınacaktır.

Dış depolamanın kullanılabilir olduğunu doğrulama

Dış depolama alanına yazmadan önce ilk adım, okunabilir veya yazılabilir olup olmadığını denetlemektir. özelliği, Android.OS.Environment.ExternalStorageState dış depolamanın durumunu tanımlayan bir dizeye sahiptir. Bu özellik, durumu temsil eden bir dize döndürür. Bu tablo, tarafından Environment.ExternalStorageStatedöndürülebilecek değerlerin listesidirExternalStorageState:

ExternalStorageState Açıklama
MediaBadRemoval Medya düzgün şekilde çıkarılmadan aniden kaldırıldı.
MediaChecking Medya mevcut ancak bir disk denetiminden geçiyor.
MediaEjecting Medya çıkarılma ve çıkarılma sürecindedir.
MediaMounted Medya takılıdır ve okunabilir veya yazılabilir.
MediaMountedReadOnly Medya takılıdır ancak yalnızca buradan okunabilir.
MediaNofs Medya mevcut ancak Android için uygun bir dosya sistemi içermiyor.
MediaRemoved Medya yok.
MediaShared Medya mevcut, ancak bağlı değil. USB üzerinden başka bir cihazla paylaşılıyor.
MediaUnknown Medyanın durumu Android tarafından tanınmaz.
MediaUnmountable Medya mevcut ancak Android tarafından bağlanamıyor.
MediaUnmounted Medya mevcut ancak bağlı değil.

Çoğu Android uygulamasının yalnızca harici depolamanın takılı olup olmadığını denetlemesi gerekir. Aşağıdaki kod parçacığı, dış depolamanın salt okunur erişim veya okuma-yazma erişimi için bağlandığını doğrulamayı gösterir:

bool isReadonly = Environment.MediaMountedReadOnly.Equals(Environment.ExternalStorageState);
bool isWriteable = Environment.MediaMounted.Equals(Environment.ExternalStorageState);

Dış depolama izinleri

Android, dış depolamaya erişmeyi tehlikeli bir izin olarak kabul eder ve bu genellikle kullanıcının kaynağa erişim izni vermesi gerekir. Kullanıcı bu izni istediği zaman iptal edebilir. Bu, herhangi bir dosya erişimi öncesinde bir çalışma zamanı izin isteğinin gerçekleştirilmesi gerektiği anlamına gelir. Uygulamalara otomatik olarak kendi özel dosyalarını okuma ve yazma izinleri verilir. Uygulamaların, kullanıcı tarafından izin verildikten sonra diğer uygulamalara ait özel dosyaları okuması ve yazması mümkündür.

Tüm Android uygulamaları, AndroidManifest.xml dış depolama için iki izinden birini bildirmelidir. İzinleri tanımlamak için aşağıdaki iki uses-permission öğeden birinin AndroidManifest.xml eklenmesi gerekir:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Not

Kullanıcı tarafından verilirseWRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE, örtük olarak da verilir. AndroidManifest.xml her iki iznin de istenmesi gerekmez.

İzinler, çözüm özelliklerinin Android Bildirimi sekmesi kullanılarak da eklenebilir:

Çözüm Gezgini - Visual Studio için Gerekli İzinler

Genel olarak konuşursak, tüm tehlikeli izinler kullanıcı tarafından onaylanmalıdır. Dış depolama izinleri, uygulamanın çalıştırılan Android sürümüne bağlı olarak bu kuralda özel durumlar olduğu bir anomalidir:

Dış depolama izni denetimlerinin akış çizelgesi

Çalışma zamanı izin isteklerini gerçekleştirme hakkında daha fazla bilgi için lütfen Xamarin.Android'de İzinler kılavuzuna bakın. Monodroid-sample LocalFiles, çalışma zamanı izin denetimleri gerçekleştirmenin bir yolunu da gösterir.

ADB ile izin verme ve iptal etme

Android uygulaması geliştirme sürecinde, çalışma zamanı izin denetimleriyle ilgili çeşitli iş akışlarını test etmek için izin vermek ve iptal etmek gerekebilir. Bunu ADB kullanarak komut isteminde yapmak mümkündür. Aşağıdaki komut satırı parçacıkları, paket adı com.companyname.app olan bir Android uygulaması için ADB kullanarak izinlerin nasıl verilip iptal edileceğini gösterir:

$ adb shell pm grant com.companyname.app android.permission.WRITE_EXTERNAL_STORAGE

$ adb shell pm revoke com.companyname.app android.permission.WRITE_EXTERNAL_STORAGE

Dosyaları silme

Standart C# API'lerinden herhangi biri, gibi System.IO.File.Deletebir dosyayı dış depolamadan silmek için kullanılabilir. Kod taşınabilirliği pahasına Java API'lerini kullanmak da mümkündür. Örneğin:

System.IO.File.Delete("/storage/emulated/0/Android/data/com.companyname.app/files/count.txt");