Storage/Media penyimpanan merupakan hal yang penting pada aplikasi berbasis mobile, salah satunya di Android. Berdasarkan data penyimpanan, di Android terdapat 2 jenis yaitu: data temporary dan data persistence. Data temporary umumnya diproses melalui internal storage dalam bentuk cache, sedangkan data persistence disimpan secara permanen dalam suatu file.
Pada artikel ini akan kita bahas jenis yang kedua yaitu data persistence. Android menyediakan beberapa solusi untuk menangani data persistence, tergantung dari sifatnya apakah private atau public. Beberapa solusi yang dipilih harus sesuai dengan kebutuhan spesifiknya, seperti apakah data yang disimpan akan bersifat private atau boleh diakses secara bebas (public) serta berapa banyak space yang dibutuhkannya. Selain itu, Android juga menyediakan cara untuk membuka data private ke aplikasi lain (apabila diperlukan), melalui Content Provider (inshaAllah akan dibahas di posting lainnya).
Images are taken from flaticon |
- Internal storage: direktori private yang hanya diakses pada aplikasi itu sendiri.
- External storage: direktori public dapat diakses secara lebih luas pada aplikasi itu sendiri dan aplikasi lainnya.
- Selalu tersedia/dapat diakses.
- Menggunakan file sistem dari device.
- Hanya bisa diakses pada aplikasi itu sendiri, kecuali secara eksplisit diatur agar dapat dibaca/tulis.
- Saat aplikasi di-uninstall/clear data, sistem akan menghapus data di internal strorage.
- Tidak selalu tersedia/dapat dihapus.
- Menggunakan file sistem dari device atau external seperti SdCard.
- World-readable, semua aplikasi dapat membaca.
- Saat aplikasi di-uninstall, sistem tidak menghapus file tersebut.
Bedah kode aplikasi MyStorage
Langkah awal dengan membuat project baru di Android Studio, disini saya menggunakan nama aplikasi MyStorage dengan nama package net.ariflaksito.mystorage, minimal SDK adalah Android 5.0. Setelah itu di kita akan membuat contoh penggunaan internal dan external storage, pada MainActivity akan saya buat dua tombol untuk menuju ke activity InStorageActivity dan ExStorageActivity menggunakan Intent.
Jika anda ingin memahami lebih detail tentang Intent bisa disimak video berikut ini:
Silahkan anda siapkan layout seperti pada tampilan dibawah ini:
Tampilan awal MainActivity |
Setelah itu kita bisa membuat 2 activity baru (Empty Activity) dengan nama : InStorageActivity dan ExStorageActivity. Untuk layout kedua activity tersebut, kita siapkan 4 Button dan 1 TextView seperti pada tampilan berikut :
Tampilan layout editor file |
Untuk kode dari layout tersebut seperti dibawah ini:
Pada kode xml diatas kita perlu tambahkan beberapa resource di file strings.xml karena data-data text kita simpan di file res/values/strings.xml. Jika nanti diperlukan localize resource seperti aplikasi yang support multi bahasa lebih mudah dalam me-manage string tersebut.
Kode Activity Internal Storage
Selanjutnya kita edit bagian inStorageActivity. Pertama kita tambahkan class attribut nama-file, button dan textview seperti ini:
public static final String FILENAME = "myfile.txt";
Button btnCreate, btnEdit, btnRead, btnDelete;
TextView tvRead;
Selanjutnya kita set masing-masing komponen tersebut dan kita tambahkan label untuk ActionBar pada method onCreate( ) seperti berikut:
String title = getResources().getString(R.string.title_in_storage);
getSupportActionBar().setTitle(title);
btnCreate = findViewById(R.id.btn_create_file);
btnEdit = findViewById(R.id.btn_edit_file);
btnRead = findViewById(R.id.btn_read_file);
btnDelete = findViewById(R.id.btn_del_file);
tvRead = findViewById(R.id.tv_read);
Selanjutnya kita buat 4 method baru untuk menjalankan masing-masing fungsi, yaitu: createFile( ), editFile( ), readFile( ) dan deleteFile( ). Pada model internal storage kita gunakan fungsi getFilesDir( ) untuk meng-akses path dari storage. Untuk kode method createFile( ) seperti berikut:
void createFile() {
String isiFile = "Hello world!";
File file = new File(getFilesDir(), FILENAME);
FileOutputStream outputStream = null;
try {
file.createNewFile();
outputStream = new FileOutputStream(file, true);
outputStream.write(isiFile.getBytes());
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Secara lengkap kode fungsi-fungsi yang lain dalam Activity tersebut seperti berikut:
Lokasi/path dari myfile.txt tersebut pada device berada di /data/data/(package-name)/files/myfile.txt. Kita dapat melihat melalui device file explorer di Android Studio untuk lokasi file tersebut. Sedangkan dari device file explorer akses ke path tersebut tidak bisa kecuali device anda sudah di root.
Lokasi file di internal storage |
Kode Activity External Storage
Pada metode penyimpanan external, kita perlu tambahkan beberapa kode untuk melakukan cek perijinan dari Android API 23 keatas. Selain mendefinisikan nama file, kita perlu mendefinisikan code request untuk kembalian dari cek perijinan tersebut. Selanjutnya kita siapkan method baru yaitu checkPermission( ) dan onRequestPermissionsResult( ).
Pada method tersebut aplikasi akan menampilkan alert/pop-up ke pengguna apakah pengguna memberikan ijin aplikasi untuk merubah data-data di storage. Jika pengguna menekan tombol allow maka akan dilanjutkan ke proses selanjutnya, jika tidak maka akses ke storage tidak bisa dilakukan oleh aplikasi.
Alert pada device untuk perijinan akses storage |
Selain itu, untuk external storage ini perlu menambahkan code permission di AndroidManifest.xml yaitu sebagai berikut:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Pada element <application> di file manifest juga perlu ditambahkan atribut berikut:
android:requestLegacyExternalStorage="true"
Untuk akses lokasi/path dari file tersebut, disni kita menggunakan method yang berada di class Environment, yaitu: Environment.getExternalStorageDirectory(). Pada method createFile( ) dan editFile( ) juga perlu ditambahkan validasi untuk cek apakah media storage tersebut sudah di mount atau belum dengan kode berikut:
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED.equals(state)) {
return;
}
Layout di activity ExStorageActivity menggunakan file yang sama pada activity sebelumnya. Untuk kode lengkap nya seperti dibawah ini:
Anda bisa ujicoba aplikasi tersebut dengan membuat file baru, melihat isi datanya, kemudian cek di device explorer, apakah sudah ada nama file tersebut. Selain itu anda bisa coba edit isi file dan hapus file.