Xamarin. Android ile dosya Depolama ve erişim

Android uygulamaları için ortak bir gereksinim, dosyaları kaydetme, belgeleri indirme veya diğer programlarla paylaşmak üzere verileri dışarı aktarmaya yöneliktir. Android (Linux tabanlı), dosya depolaması için alan sağlayarak bunu destekler. Android, dosya sistemini iki farklı depolama türüne gruplandırır:

  • iç Depolama : bu, yalnızca uygulama veya işletim sistemi tarafından erişilebilen dosya sisteminin bir parçasıdır.
  • dış Depolama : bu, tüm uygulamalar, kullanıcı ve muhtemelen diğer cihazlar tarafından erişilebilen dosyaların depolanması için bir bölümdür. Bazı cihazlarda, dış depolama kaldırılabilir (SD kart gibi).

Bu gruplandırmalar yalnızca kavram amaçlıdır ve cihazdaki tek bir bölüme veya dizine başvurmayabilir. Android cihaz, her zaman iç depolama ve harici depolama için bölüm sağlar. Bazı cihazlarda dış depolama olarak kabul edilen birden çok bölüm olabilir. Bölümden bağımsız olarak dosya okuma, yazma veya oluşturma için API 'Ler aynıdır. Xamarin. Android uygulamasının dosya erişimi için kullanabileceği iki API kümesi vardır:

  1. .NET API 'leri (mono tarafından sunulan ve Xamarin. Android tarafından Sarmalanan) – bunlar Xamarin. Essentialstarafından sunulan dosya sistemi yardımcıları içerir. .NET API 'Leri, en iyi platformlar arası uyumluluğu sağlar ve bu şekilde bu kılavuzun odağı bu API 'lerde olacaktır.
  2. Yerel Java dosya erişimi API 'leri (Java tarafından sağlanan ve Xamarin. Android tarafından Sarmalanan) – Java, dosyaları okumak ve yazmak Için kendi API 'lerini sağlar. Bunlar .NET API 'Leri için tamamen kabul edilebilir bir alternatiftir, ancak Android 'e özeldir ve platformlar arası olması amaçlanan uygulamalar için uygun değildir.

Dosyaları okuma ve yazma işlemi, Xamarin. Android ile neredeyse aynı diğer .NET uygulamaları ile aynıdır. Xamarin. Android uygulaması, değiştirilecek dosyanın yolunu belirler ve ardından dosya erişimi için standart .NET ıoms kullanır. İç ve dış depolamaya yapılan 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 bir şekilde kodlendirmek önerilmez. Bunun yerine, dosyaların yolunu öğrenmek için Xamarin. Android API 'Lerini kullanın. Bu şekilde, dosyaları okumak ve yazmak için .NET API 'Leri, iç ve dış depolamadaki dosyaların yolunu belirlemede yardımcı olacak yerel Android API 'Lerini kullanıma sunar.

Dosya erişimiyle ilgili API 'Leri tartışmadan önce, iç ve dış depolamayı çevreleyen bazı ayrıntıların anlaşılması önemlidir. Bu, sonraki bölümde ele alınacaktır.

İç ve dış depolama

Kavramsal olarak, dahili depolama ve dış depolama çok benzerdir; her iki yerde de bir Xamarin. Android uygulamasının dosyaları kaydedebileceği yer vardır. Bu benzerlik, Android 'e tanıdık olmayan geliştiriciler için, bir uygulamanın dahili depolama ve dış depolama kullanması gerektiğinde net bir şekilde kafa karıştırıcı olabilir.

İç depolama, Android 'in işletim sistemi, APKs ve bireysel uygulamalar için ayırdığı geçici olmayan belleğe başvurur. Bu alan, işletim sistemi veya uygulamalar dışında erişilebilir değildir. Android, her uygulama için iç depolama bölümünde bir dizin ayırır. Uygulama kaldırıldığında, bu dizindeki iç depolamada tutulan tüm dosyalar da silinir. Dahili depolama, yalnızca uygulamayla erişilebilen ve diğer uygulamalarla paylaşılmayan ve uygulama kaldırıldıktan sonra çok az değere sahip olan dosyalar için idealdir. Android 6,0 veya üzeri sürümlerde, dahili depolamada bulunan dosyalar, android 6,0 ' deki otomatik yedekleme özelliğikullanılarak Google tarafından otomatik olarak yedeklenir. İç depolama aşağıdaki dezavantajlara sahiptir:

  • Dosyalar paylaşılamaz.
  • Uygulama kaldırıldığında dosyalar silinir.
  • Dahili depolamada kullanılabilir alan sınırlı olabilir.

Harici depolama, iç depolama olmayan ve bir uygulamayla özel olarak erişilemeyen dosya depolama birimini ifade eder. Dış depolamanın birincil amacı, uygulamalar arasında paylaşılmak üzere veya iç depolamaya sığamayacak kadar büyük olan dosyaları yerleştirmek için bir yer sağlamaktır. Dış depolamanın avantajı, genellikle iç depolamaya göre dosyalar için çok daha fazla alana sahip olur. Ancak, dış depolamanın her zaman bir cihazda mevcut olmadığı garanti edilmez ve kullanıcıdan bu kullanıcıya erişmesi için özel izin gerekebilir.

Not

Birden çok kullanıcıyı destekleyen cihazlarda, Android her kullanıcının hem iç hem de dış depolamada kendi dizinini sağlar. Bu dizine cihazdaki diğer kullanıcılar erişemez. Bu ayrım, iç veya dış depolamadaki dosyalara kod yolmayın olmadıkları sürece uygulamalar tarafından görünmez.

Bir Thumb kuralı olarak, Xamarin. Android Uygulamaları, her zaman mantıklı olduğunda dosyalarını iç depolamaya kaydetmenizi ve dosyaların diğer uygulamalarla paylaşılması gerektiğinde, çok büyük olması veya uygulama kaldırılsa bile korunması gerekir. Örneğin, bir yapılandırma dosyası, kendisini oluşturan uygulama haricinde önemli olmadığından, iç depolama için en uygun seçenektir. Buna karşılık, fotoğraflar dış depolama için iyi bir adaydır. Bunlar çok büyük olabilir ve uygulama kaldırılsa bile Kullanıcı bunları paylaşmak veya bunlara erişmek isteyebilir.

Bu kılavuz iç depolamaya odaklanacaktır. Lütfen bir Xamarin. Android uygulamasında dış depolamayı kullanma hakkında ayrıntılı bilgi için bkz. dış depolama Kılavuzu.

İç depolama ile çalışma

Bir uygulamanın iç depolama dizini, işletim sistemi tarafından belirlenir ve özelliği tarafından Android uygulamalarına açıktır Android.Content.Context.FilesDir . Bu, Java.IO.File Android 'in uygulama için özel olarak ayrılmış olduğu dizini temsil eden bir nesne döndürür. Örneğin, com. CompanyName paket adına sahip bir uygulama, iç depolama dizini şu şekilde olabilir:

/data/user/0/com.companyname/files

Bu belge, INTERNAL_STORAGEolarak iç depolama dizinine başvuracaktır.

Önemli

İç depolama dizininin tam yolu cihazdan cihaza ve Android sürümleri arasında farklılık gösterebilir. Bu nedenle, uygulamalar iç dosyalar depolama dizini için yolu sabit olarak kodmamalıdır ve bunun yerine Xamarin. Android API 'Lerini kullanır System.Environment.GetFolderPath() .

Kod paylaşımını en üst düzeye çıkarmak için, Xamarin. Android Uygulamaları (veya Xamarin. Android 'i hedefleyen Xamarin. Forms uygulamaları) System.Environment.GetFolderPath() yöntemini kullanmalıdır. Xamarin. Android dosyasında, bu yöntem ile aynı konumda olan bir dizin için bir dize döndürür Android.Content.Context.FilesDir . Bu yöntem, System.Environment.SpecialFolder işletim sistemi tarafından kullanılan özel klasörlerin yollarını temsil eden bir numaralandırılmış sabitler kümesini tanımlamak için kullanılan bir sabit listesini alır. Değerlerin hepsi, System.Environment.SpecialFolder Xamarin. Android üzerinde geçerli bir dizinle eşleşmeyecektir. Aşağıdaki tabloda verilen bir değer için hangi yolun beklenildiği açıklanmaktadır System.Environment.SpecialFolder :

System. Environment. SpecialFolder Yol
ApplicationData INTERNAL_STORAGE/.config
Desktop INTERNAL_STORAGE/Desktop
LocalApplicationData INTERNAL_STORAGE/PST local/share
MyDocuments INTERNAL_STORAGE
MyMusic INTERNAL_STORAGE/Music
MyPictures INTERNAL_STORAGE/resim
MyVideos INTERNAL_STORAGE/videolar
Personal INTERNAL_STORAGE
Fonts INTERNAL_STORAGE/.exe
Templates INTERNAL_STORAGE/Templates
CommonApplicationData /usr/share
CommonApplicationData /usr/share

İç depolamadaki dosyaları okuma veya yazma

Bir dosyaya yazma Için C# API 'lerden herhangi biri yeterlidir; Tüm bunlar, uygulamaya ayrılan dizindeki dosyanın yolunu almak için gereklidir. .NET API 'lerinin zaman uyumsuz sürümlerinin, ana iş parçacığını engelleyen dosya erişimiyle ilişkilendirebileceğiniz sorunları en aza indirmek için kullanılması önemle tavsiye edilir.

Bu kod parçacığı, bir uygulamanın iç depolama dizinine bir UTF-8 metin dosyasına tamsayı yazmanın bir örneğidir:

public async Task SaveCountAsync(int count)
{
    var backingFile = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "count.txt");
    using (var writer = File.CreateText(backingFile))
    {
        await writer.WriteLineAsync(count.ToString());
    }
}

Sonraki kod parçacığı, bir metin dosyasında depolanan bir tamsayı değerini okumak için bir yol sağlar:

public async Task<int> ReadCountAsync()
{
    var backingFile = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "count.txt");

    if (backingFile == null || !File.Exists(backingFile))
    {
        return 0;
    }

    var count = 0;
    using (var reader = new StreamReader(backingFile, true))
    {
        string line;
        while ((line = await reader.ReadLineAsync()) != null)
        {
            if (int.TryParse(line, out var newcount))
            {
                count = newcount;
            }
        }
    }

    return count;
}

Xamarin. Essentials ile dosya sistemi yardımcıları kullanma

Xamarin. Essentials , platformlar arası uyumlu kod yazmak Için bir API kümesidir. Dosya sistemi yardımcıları , uygulamanın önbelleğini ve veri dizinlerini bulmaya basitleştirecek bir dizi yardımcılar içeren bir sınıftır. Bu kod parçacığı, bir uygulamanın iç depolama dizinini ve önbellek dizinini bulma hakkında bir örnek sağlar:

// Get the path to a file on internal storage
var backingFile = Path.Combine(Xamarin.Essentials.FileSystem.AppDataDirectory, "count.txt");

// Get the path to a file in the cache directory
var cacheFile = Path.Combine(Xamarin.Essentials.FileSystem.CacheDirectory, "count.txt");

Dosyaları gizleme MediaStore

, MediaStore Bir Android cihazında medya dosyaları (videolar, müzikler, görüntüler) hakkında meta veri toplayan bir Android bileşenidir. Amacı, cihazdaki tüm Android uygulamalarında bu dosyaların paylaşılmasını basitleştirir.

Özel dosyalar, paylaşılabilir medya olarak gösterilmez. Örneğin, bir uygulama bir resmi özel dış depolamaya kaydederse, bu dosya medya tarayıcısı () tarafından alınmaz MediaStore .

Ortak dosyalar tarafından alınacaktır MediaStore . Sıfır baytlık dosya adına sahip dizinler . NOMEDIA , tarafından taranmaz .