Bagikan melalui


Penyimpanan eksternal

Penyimpanan eksternal mengacu pada penyimpanan file yang tidak ada di penyimpanan internal dan tidak dapat diakses secara eksklusif oleh aplikasi yang bertanggung jawab atas file. Tujuan utama penyimpanan eksternal adalah untuk menyediakan tempat untuk menempatkan file yang dimaksudkan untuk dibagikan antara aplikasi atau yang terlalu besar agar sesuai dengan penyimpanan internal.

Secara historis, penyimpanan eksternal yang disebut partisi disk pada media yang dapat dilepas seperti kartu SD (juga dikenal sebagai penyimpanan portabel). Perbedaan ini tidak lagi relevan karena perangkat Android telah berevolusi dan banyak perangkat Android tidak lagi mendukung penyimpanan yang dapat dilepas. Sebaliknya beberapa perangkat akan mengalokasikan beberapa memori non-volatil internal mereka ke Android yang dapat melakukan fungsi yang sama dengan media yang dapat dilepas. Ini dikenal sebagai penyimpanan yang ditimulasi dan masih dianggap sebagai penyimpanan eksternal. Secara bergantian, beberapa perangkat Android mungkin memiliki beberapa partisi penyimpanan eksternal. Misalnya, tablet Android (selain penyimpanan internalnya) mungkin telah meniru penyimpanan dan satu atau beberapa slot untuk kartu SD. Semua partisi ini diperlakukan oleh Android sebagai penyimpanan eksternal.

Pada perangkat yang memiliki beberapa pengguna, setiap pengguna akan memiliki direktori khusus pada partisi penyimpanan eksternal utama untuk penyimpanan eksternal mereka. Aplikasi yang berjalan sebagai satu pengguna tidak akan memiliki akses ke file dari pengguna lain di perangkat. File untuk semua pengguna masih dapat dibaca di dunia dan dapat ditulis di dunia; namun, Android akan melakukan sandbox setiap profil pengguna dari yang lain.

Membaca dan menulis ke file hampir identik di Xamarin.Android seperti halnya aplikasi .NET lainnya. Aplikasi Xamarin.Android menentukan jalur ke file yang akan dimanipulasi, lalu menggunakan idiom .NET standar untuk akses file. Karena jalur aktual ke penyimpanan internal dan eksternal dapat bervariasi dari perangkat ke perangkat atau dari versi Android ke versi Android, tidak disarankan untuk memberi kode keras jalur ke file. Sebagai gantinya, Xamarin.Android mengekspos API Android asli yang akan membantu menentukan jalur ke file di penyimpanan internal dan eksternal.

Panduan ini akan membahas konsep dan API di Android yang khusus untuk penyimpanan eksternal.

File publik dan privat pada penyimpanan eksternal

Ada dua jenis file berbeda yang mungkin disimpan aplikasi di penyimpanan eksternal:

  • File privat – File privat adalah file yang khusus untuk aplikasi Anda (tetapi masih dapat dibaca di dunia dan dapat ditulis di dunia). Android mengharapkan bahwa file privat disimpan dalam direktori tertentu di penyimpanan eksternal. Meskipun file disebut "privat", file tersebut masih terlihat dan dapat diakses oleh aplikasi lain di perangkat, file tersebut tidak diberi perlindungan khusus oleh Android.

  • File publik - Ini adalah file yang tidak dianggap spesifik untuk aplikasi dan dimaksudkan untuk dibagikan secara bebas.

Perbedaan antara file-file ini terutama konseptual. File privat bersifat pribadi dalam arti bahwa file dianggap sebagai bagian dari aplikasi, sementara file publik adalah file lain yang ada di penyimpanan eksternal. Android menyediakan dua API berbeda untuk menyelesaikan jalur ke file privat dan publik, tetapi jika tidak, API .NET yang sama digunakan untuk membaca dan menulis ke file-file ini. Ini adalah API yang sama yang dibahas di bagian tentang membaca dan menulis.

File eksternal privat

File eksternal privat dianggap khusus untuk aplikasi (mirip dengan file internal) tetapi disimpan di penyimpanan eksternal karena sejumlah alasan (seperti terlalu besar untuk penyimpanan internal). Mirip dengan file internal, file-file ini akan dihapus saat aplikasi dihapus instalasinya oleh pengguna.

Lokasi utama untuk file eksternal privat ditemukan dengan memanggil metode Android.Content.Context.GetExternalFilesDir(string type). Metode ini akan mengembalikan Java.IO.File objek yang mewakili direktori penyimpanan eksternal privat untuk aplikasi. Meneruskan null ke metode ini akan mengembalikan jalur ke direktori penyimpanan pengguna untuk aplikasi. Sebagai contoh, untuk aplikasi dengan nama com.companyname.apppaket , direktori "root" dari file eksternal privat adalah:

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

Dokumen ini akan merujuk ke direktori penyimpanan untuk file privat pada penyimpanan eksternal sebagai PRIVATE_EXTERNAL_STORAGE.

Parameter untuk GetExternalFilesDir() adalah string yang menentukan direktori aplikasi. Ini adalah direktori yang dimaksudkan untuk menyediakan lokasi standar untuk organisasi file logis. Nilai string tersedia melalui konstanta pada Android.OS.Environment kelas :

Android.OS.Environment Direktori
DirectoryAlarms PRIVATE_EXTERNAL_STORAGE/Alarm
DirectoryDcim PRIVATE_EXTERNAL_STORAGE/DCIM
DirektoriUnduh PRIVATE_EXTERNAL_STORAGE/Unduh
DirectoryDocuments PRIVATE_EXTERNAL_STORAGE/Dokumen
DirectoryMovies PRIVATE_EXTERNAL_STORAGE/Film
DirektoriMusic PRIVATE_EXTERNAL_STORAGE/Musik
DirectoryNotifications PRIVATE_EXTERNAL_STORAGE/Pemberitahuan
DirectoryPodcasts PRIVATE_EXTERNAL_STORAGE/Podcast
DirectoryRingtones PRIVATE_EXTERNAL_STORAGE/Nada Dering
DirectoryPictures PRIVATE_EXTERNAL_STORAGE/Gambar

Untuk perangkat yang memiliki beberapa partisi penyimpanan eksternal, setiap partisi akan memiliki direktori yang ditujukan untuk file privat. Metode Android.Content.Context.GetExternalFilesDirs(string type) ini akan mengembalikan array .Java.IO.Files Setiap objek akan mewakili direktori khusus aplikasi privat di semua perangkat penyimpanan bersama/eksternal tempat aplikasi dapat menempatkan file yang dimilikinya.

Penting

Jalur yang tepat ke direktori penyimpanan eksternal privat dapat bervariasi dari perangkat ke perangkat dan antar versi Android. Karena itu, aplikasi tidak boleh melakukan hard code jalur ke direktori ini, dan sebaliknya menggunakan API Xamarin.Android, seperti Android.Content.Context.GetExternalFilesDir().

File eksternal publik

File publik adalah file yang ada di penyimpanan eksternal yang tidak disimpan di direktori yang dialokasikan Android untuk file privat. File publik tidak akan dihapus saat aplikasi dihapus instalasinya. Aplikasi Android harus diberikan izin sebelum dapat membaca atau menulis file publik apa pun. Dimungkinkan bagi file publik untuk ada di mana saja di penyimpanan eksternal, tetapi menurut konvensi Android mengharapkan file publik ada di direktori yang diidentifikasi oleh properti Android.OS.Environment.ExternalStorageDirectory. Properti ini akan mengembalikan Java.IO.File objek yang mewakili direktori penyimpanan eksternal utama. Sebagai contoh, Android.OS.Environment.ExternalStorageDirectory dapat merujuk ke direktori berikut:

/storage/emulated/0/

Dokumen ini akan merujuk ke direktori penyimpanan untuk file publik pada penyimpanan eksternal sebagai PUBLIC_EXTERNAL_STORAGE.

Android juga mendukung konsep direktori aplikasi di PUBLIC_EXTERNAL_STORAGE. Direktori ini sama persis dengan direktori aplikasi untuk PRIVATE_EXTERNAL_STORAGE dan dijelaskan dalam tabel di bagian sebelumnya. Metode Android.OS.Environment.GetExternalStoragePublicDirectory(string directoryType) ini akan mengembalikan Java.IO.File objek yang sesuai dengan direktori aplikasi publik. Parameter directoryType adalah parameter wajib dan tidak boleh null.

Misalnya, panggilan Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDocuments).AbsolutePath akan mengembalikan string yang akan menyerupai:

/storage/emulated/0/Documents

Penting

Jalur yang tepat ke direktori penyimpanan eksternal publik dapat bervariasi dari perangkat ke perangkat dan antar versi Android. Karena itu, aplikasi tidak boleh melakukan hard code jalur ke direktori ini, dan sebaliknya menggunakan API Xamarin.Android, seperti Android.OS.Environment.ExternalStorageDirectory.

Bekerja dengan penyimpanan eksternal

Setelah aplikasi Xamarin.Android mendapatkan jalur lengkap ke file, aplikasi tersebut harus menggunakan salah satu API .NET standar untuk membuat, membaca, menulis, atau menghapus file. Ini memaksimalkan jumlah kode yang kompatibel lintas platform untuk aplikasi. Namun, sebelum mencoba mengakses file, aplikasi Xamarin.Android harus memastikan bahwa apakah mungkin untuk mengakses file tersebut.

  1. Verifikasi penyimpanan eksternal - Tergantung pada sifat penyimpanan eksternal, ada kemungkinan bahwa penyimpanan tersebut mungkin tidak dipasang dan dapat digunakan oleh aplikasi. Semua aplikasi harus memeriksa status penyimpanan eksternal sebelum mencoba menggunakannya.
  2. Lakukan pemeriksaan izin runtime – Aplikasi Android harus meminta izin dari pengguna untuk mengakses penyimpanan eksternal. Ini berarti bahwa permintaan izin run time harus dilakukan sebelum akses file apa pun. Panduan Izin Di Xamarin.Android berisi detail selengkapnya tentang izin Android.

Masing-masing dari kedua tugas ini akan dibahas di bawah ini.

Memverifikasi bahwa penyimpanan eksternal tersedia

Langkah pertama sebelum menulis ke penyimpanan eksternal adalah memeriksa apakah dapat dibaca atau ditulis. Properti Android.OS.Environment.ExternalStorageState menyimpan string yang mengidentifikasi status penyimpanan eksternal. Properti ini akan mengembalikan string yang mewakili status. Tabel ini adalah daftar ExternalStorageState nilai yang mungkin dikembalikan oleh Environment.ExternalStorageState:

ExternalStorageState Deskripsi
MediaBadRemoval Media tiba-tiba dihapus tanpa dilepas dengan benar.
MediaChecking Media ada tetapi menjalani pemeriksaan disk.
MediaEjecting Media sedang dalam proses dilepas dan dikeluarkan.
MediaMounted Media dipasang dan dapat dibaca atau ditulis.
MediaMountedReadOnly Media dipasang tetapi hanya dapat dibaca.
MediaNofs Media ada tetapi tidak berisi sistem file yang cocok untuk Android.
MediaRemoved Tidak ada media yang ada.
MediaShared Media ada, tetapi tidak dipasang. Ini sedang dibagikan melalui USB dengan perangkat lain.
MediaUnknown Status media tidak dikenali oleh Android.
MediaUnmountable Media ada tetapi tidak dapat dipasang oleh Android.
MediaUnmounted Media ada tetapi tidak dipasang.

Sebagian besar aplikasi Android hanya perlu memeriksa apakah penyimpanan eksternal dipasang. Cuplikan kode berikut menunjukkan cara memverifikasi bahwa penyimpanan eksternal dipasang untuk akses baca-saja atau akses baca-tulis:

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

Izin penyimpanan eksternal

Android menganggap mengakses penyimpanan eksternal sebagai izin berbahaya, yang biasanya mengharuskan pengguna untuk memberikan izin mereka untuk mengakses sumber daya. Pengguna dapat mencabut izin ini kapan saja. Ini berarti bahwa permintaan izin run time harus dilakukan sebelum akses file apa pun. Aplikasi secara otomatis diberikan izin untuk membaca dan menulis file privat mereka sendiri. Dimungkinkan bagi aplikasi untuk membaca dan menulis file privat milik aplikasi lain setelah diberikan izin oleh pengguna.

Semua aplikasi Android harus mendeklarasikan salah satu dari dua izin untuk penyimpanan eksternal di AndroidManifest.xml . Untuk mengidentifikasi izin, salah satu dari dua uses-permission elemen berikut harus ditambahkan ke AndroidManifest.xml:

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

Catatan

Jika pengguna memberikan , maka READ_EXTERNAL_STORAGE juga diberikan secara implisitWRITE_EXTERNAL_STORAGE. Tidak perlu meminta kedua izin dalam AndroidManifest.xml.

Izin juga dapat ditambahkan menggunakan tab Manifes Android dari properti solusi:

Solution Explorer - Required Permissions for Visual Studio

Secara umum, semua izin berbahaya harus disetujui oleh pengguna. Izin untuk penyimpanan eksternal adalah anomali karena ada pengecualian untuk aturan ini, tergantung pada versi Android yang dijalankan aplikasi:

Flowchart of external storage permission checks

Untuk informasi selengkapnya tentang melakukan permintaan izin runtime, silakan lihat panduan Izin Di Xamarin.Android. LocalFiles monodroid-samplejuga menunjukkan salah satu cara melakukan pemeriksaan izin runtime.

Memberikan dan mencabut izin dengan ADB

Dalam mengembangkan aplikasi Android, mungkin perlu memberikan dan mencabut izin untuk menguji berbagai alur kerja yang terlibat dengan pemeriksaan izin runtime. Dimungkinkan untuk melakukan ini di prompt perintah menggunakan ADB. Cuplikan baris perintah berikut menunjukkan cara memberikan atau mencabut izin menggunakan ADB untuk aplikasi Android yang nama paketnya com.companyname.app:

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

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

Menghapus file

Salah satu API C# standar dapat digunakan untuk menghapus file dari penyimpanan eksternal, seperti System.IO.File.Delete. Dimungkinkan juga untuk menggunakan API Java dengan mengorbankan portabilitas kode. Contohnya:

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