• Tidak ada hasil yang ditemukan

Memiih Penyimpanan Internal atau External

N/A
N/A
Protected

Academic year: 2021

Membagikan "Memiih Penyimpanan Internal atau External"

Copied!
10
0
0

Teks penuh

(1)

PERTEMUAN KE – 10 Data dan Akses File Lokal

(Aplikasi Baca Tulis File)

A. TUJUAN

Mahasiswa diharapkan dapat memahami dan mengetahui tentang Data dan Akses File Lokal yang digunakan pada aplikasi mobile.

B. TEORI SINGKAT

Object File dirancang untuk membca atau menulis data dalam jumlah besar di dalam urutan mulai sampai selesai tanpa ada yang kelewatan. Misalnya dia dibuat untuk file image atau yang lainnya yang diubah melalui jaringan. Saat ini kita akan mempelajari bagaimana melakukan tugas-tugas yang berhubungan dengan file dasar di dalam app. Asumsinya bahwa kita sudah terbiasa dengan basis sistem file Linux dan API input/output standard di dalam java.io.

Memiih Penyimpanan Internal atau External

Semua perangkat android mempunyai dua area penyimpanan: “internal dan eksternal”. Nama-nama ini berasal dari saat-saat awal Android, ketika kebanyakan perangkat menawarkan memori non-volatile built-in (penyimpanan internal), pus sebuah media penyimpanan yang bisa dipindahkan seperti kartu micro SD (penyimpanan eksternal). Beberapa perangkat membagi ruang penyimpanan permanen ke dalam partisi “internal” dan “eksternal”, sehingga bahkan ketika tanpa media penyimpanan removable tetap selalu ada dua ruang sehingga tingkah laku API tetap sama baik ada pemyimpanan removable atau tidak. Berikut ini merangkum kenyataan mengenai ruang penyimpanan.

Penyimpanan internal:  Selalu ada

 File yang disimpan di sini hanya bisa diakses oleh app default.

 Pada saat user melakukan uninstall app, system menghapus semua file app dari penyimpanan internal.

Penyimpanan internal paling baik pada saat kita yakin apakah aplikasi lain bisa mengakses file kita atau tidak.

Penyimpanan eksternal:

 Tidak selalu ada, karena user bisa memasang penyimpanan eksternal seperti USB dan kemudian mencopotnya kembali dari perangkat kita.

 Bisa dibaca dimana saja, sehingga file yang disimpan di sini bisa diakses di luar kontrol kita.

 Bia user meng-uninstall app anda, system menghapus file app anda dari sini bila kita menyimpannya di dalam directory dari getExternalFilesDir().

Penyimpanan eksternal adalah tempat terbaik untuk file-file yang tidak membutuhkan batasan akses dan untuk file-file yang ingin kita bagikan dengan app lain atau kita ijinkan user lain untuk mengakses dengan sebuah komputer lain.

(2)

Untuk menulis ke penyimpanan eksternal, kita harus mengajukan ijin WRITE_EXTERNAL_STORAGE di dalam

manifest file kita:

<manifest ...>

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

</manifest>

Saat ini, semua apps mempuyai kemampuan untuk membaca penyimpanan eksternal tanpa sebuah ijin khusus. Namun, hal ini akan berubah di masa mendatang. Bila app ingin membaca penyimpanan eksternal (tetapi tidak menulisnya), maka kita harus mendeklarasikan

ijin READ_EXTERNAL_STORAGE . Untuk memastikan app anda terus bekerja seperti diharapkan, kita harus mendeklarasikan ijin itu sekarang, sebelum perubahan itu berpengaruh.

<manifest ...>

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

</manifest>

Namun, bila app kita menggunakan ijin WRITE_EXTERNAL_STORAGE , maka secara implisit dia sudah mendapatkan ijin untuk membaca penyimpanan eksternal juga. Kita tidak perlu ijin untuk menyimpan file di penyimpanan internal. Aplikasi kita selalu mempunyai ijin untuk membaca dan menulis file di dalam direktori penyimpanan internal nya sendiri.

Menyimpan File di Penyimpanan internal

Pada saat menyimpan sebuah file di penyimpanan internal, anda bisa menggunakan direktori yang sesuai sebagai sebuah file dengan memanggil salah satu dari sua method di bawah ini:

getFilesDir()

mengembalikan sebuah file yang merepresentasikan sebuah direktori internal untuk app kita. getCacheDir()

Mengembalikan sebuah file yang merepresentasikan direktori internal untuk file cache sementara app kita. Pastikan untuk menghapus setiap file begitu tidak lagi digunakan dan implementasikan batasan ukuran yang masuk akal pada memori yang kita gunakan pada suatu saat tertentu, seperti misalnya 1MB. Bila sistem mulai berjalan lambat di penyimpanan, sistem akan menghapus file cache kita tanpa pemberitahuan lebih dulu.

Untuk membuat sebuah file baru di dalam salah satu dari direktori-direktori ini, kita bisa menggunakan File() constructor, yang melewatkan File yang disediakan oleh salah satu method di agtas yang menspesifikasi direktori penyimpanan internal kita. Misalnya:

(3)

Alternatifnya, kita bisa memanggil openFileOutput() untuk mendapatkan FileOutputStream yang menuliskan ke sebuah file di dalam direktori internal kita. Di bawah ini adalah bagaimana menuliskan beberapa teks ke sebuah file:

String filename = "myfile"; String string = "Hello world!"; FileOutputStream outputStream;

try {

outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes());

outputStream.close(); } catch (Exception e) { e.printStackTrace(); }

Atau, bila kita ingin meletakkan beberapa file, kita harus menggunakan createTempFile(). Misalnya, method berikut mengekstraks nama file dari sebuah URL dan membuat sebuah file dengan nama yang ada di dalam direktori cache internal app kita:

public File getTempFile(Context context, String url) { File file;

try {

String fileName = Uri.parse(url).getLastPathSegment();

file = File.createTempFile(fileName, null, context.getCacheDir()); catch (IOException e) {

// Error while creating file }

return file; }

Menyimpan File pada Penyimpanan eksternal

Karena penyimpanan eksternal bisa tidak ada—seperti ketika user sudah memasang atau mengambilnya dari sebuah PC yang menyedakan penyimpanan eksternal—kita harus selalu memverifikasi bahwa volumenya selalu siap sebelum mengaksesnya. Kita bisa menanyakan status penyimpanan eksternal state dengan memanggil getExternalStorageState(). Bila status returnnya sama dengan MEDIA_MOUNTED, maka kita bisa membaca atau menulisis file kita. Misalnya, method berikut berguna untuk menentukan keberadaan penyimpanan:

/* Checks if penyimpanan eksternal is available for read and write */ public boolean isExternalStorageWritable() {

String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) {

return true; }

return false; }

/* Checks if penyimpanan eksternal is available to at least read */ public boolean isExternalStorageReadable() {

String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) ||

Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true;

(4)

return false; }

Meskipun penyimpanan eksternal bisa dimodifikasi oleh app user yang lain, ada dua kategori file yang bisa kita simpan di sini:

Public files

File yang harus secara bebas ada utuk app lainnya dan untuk user lain. Pada sat user menguninstal app kita, file-file ini tetap ada untuk untuk user yang bersangkutan. Contohnya, foto yang diambil oleh app kita atau fie download lainnya.

Private files

File-file yang haknya adalah milik app kita dan harus dihapus pada sat user mengunsinstal aplikasi kita. Meskipun file-file ini secara teknis bisa diakses oleh user lain dan app lain karena mereka ada di penyimpanan eksternal, mereka adalah file yang sebenarnya tidak menyediakan value ke user lain ke app kita. Pada saat user menguninstal app anda, sistem menghapus semua file di daam direktori private external app kita. Contoh, resource tambahan yang di download oleh app anda atau file media sementara. Jika kita ingin menyimpan file-file pada penyimpanan eksternal, gunakan method getExternalStoragePublicDirectory() untuk mendapakan sebuah File yang merepresentasikan direktori yang sesuai pada penyimpanan eksternal. Method tersebut mengambil sebuah argumen yang mengkhususkan tipe file yang ingin kita simpan sehingga mereka bisa secara logis diatur dengan fie publik lainnya, seperti DIRECTORY_MUSIC atau DIRECTORY_PICTURES. Misalnya:

public File getAlbumStorageDir(String albumName) {

// Get the directory for the user's public pictures directory. File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), albumName);

if (!file.mkdirs()) {

Log.e(LOG_TAG, "Directory not created"); }

return file; }

jika kita ingin menyimpan file pribadi (private) ke app kita, kita bisa mendapatkan direktori yang sesuai dengan memanggil getExternalFilesDir() dan menamainya dengan sebuah nama yang menunjukkan tiipe direktori yang kita inginkan. Setiap direktori yang dibuat dengan cara ini ditambahkan ke sebuah direktori induk yang merangkum semua file penyimpanan eksternal app kita, yang akan dihapus oleh sistem file ketika user menguninstal app kita. Contohnya, di bawah ini adalah method yang bisa kita gunakan untuk membuat sebuah direktori untuk sebuah album foto individu:

public File getAlbumStorageDir(Context context, String albumName) { // Get the directory for the app's private pictures directory. File file = new File(context.getExternalFilesDir(

Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) {

Log.e(LOG_TAG, "Directory not created"); }

(5)

return file; }

Jika tidak ada nama sub0dir yang didefinisikan sebelumnya yang cocok dengan file kita, kita bisa memanggil getExternalFilesDir() dan melewatkan null. Hal ini mengembalikan root directory direktotori private app kita pada penyimpanan eksternal. Ingat bahwa getExternalFilesDir() menciptakan sebuah direktori di dalam sebuah direktori yang dihapus pada saat user menguninstal app kita. Bila file-file yang kita simpan harus tetap ada setelah user melakukan uninstall app kita – seperti misalnya ketika app kita adalah sebuah kamera dan user

ingin tetap menyimpan foto-foto — kita sebaiknya menggunakan

getExternalStoragePublicDirectory(). Tidak peduli kita menggunakan getExternalStoragePublicDirectory() atau tidak untuk file-file yang dibagikan atau getExternalFilesDir() untuk file-file yang bersifat private ke app kita, penting diperhatikan bahwa kita menggunakan nama direktori yang disediakan oleh konstanta API seperti DIRECTORY_PICTURES. Nama-nama direktori ini memastikan bahwa file-file diperlakukan secara benar oleh sistem. Misalnya, file yang disimpan di dalam DIRECTORY_RINGTONES dikategorikan oleh scanner media sistem sebagai ringtone bukan musik.

Query Free Space

Bila kita mengetahui sebelumnya berapa banyak data yang kita simpan, kita bisa mendapati apakah ruangnya cukup atau tidak sehingga tidak menyebabkan IOException dengan memanggil getFreeSpace() atau getTotalSpace(). Method ini memberikan ruang yang ada saat itu serta total ruang di dalam volume penyimpanan secara berurutan. Informasi ini juga berguna untuk menghindari filing volume penyimpanan di atas ambang batas.

Akan tetapi sistem tidak menjamin bahwa anda bisa menulis sebanyak byte yang ditunjukkan oleh getFreeSpace(). Bila bilangan return beberapa MB lebih besar dari ukuran data yang akan kita simpan, atau bila sistem lebih kecil dari 90% full, maka kemungkinan prosesnya akan aman. Namun bila sebaliknya, sebaiknya anda tidak menulis ke penyimpanan.

Menghapus File

Kita harus selalu menghapus file-file yang tidak kita perlukan lagi. Cara yang paling singkat menlakukan hal ini adalah dengan memanggil delete() pada dirinya sendiri.

myFile.delete();

Bila file disimpan pada penyimpanan internal, kita juga bisa menanyakan Context untuk menemukan lokasi dan menghapus sebuah file dengan memanggil deleteFile():

myContext.deleteFile(fileName);

Ketika user menguninstal app kita, sistem Android menghapus seperti di bawah ini:  Semua file yang kita simpan di penyimpanan internal

(6)

Akan tetapi kita harus secara manual menghapus semua file cache yang dibuat dengan getCacheDir() pada sebuah basis reguler dan juga secara reguler menghapus file-file lain yang tidak kita perlukan lagi.

C. PRAKTIK

1. Buat project baru. Kemudian pada layoutnya, buat layout seperti berikut.

2. Kodingnya adalah sebagai berikut. <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/content_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="belajar.coba.ningrum.tryfile.MainActivity" tools:showIn="@layout/activity_main" android:orientation="vertical"> <LinearLayout android:paddingTop="10dp" android:paddingBottom="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textNama" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Nama:" android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText

(7)

android:id="@+id/editNama" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" android:inputType="textPersonName" > <requestFocus /> </EditText> </LinearLayout> <LinearLayout android:paddingTop="10dp" android:paddingBottom="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textTelepon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="No Telepon:"

android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText android:id="@+id/editTelepon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" android:inputType="phone" /> </LinearLayout> <Button android:paddingTop="10dp" android:paddingBottom="10dp" android:id="@+id/buttonInput" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Input No Telepon" />

<TextView

android:paddingTop="10dp" android:id="@+id/textDataTelp" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Data Telepon: \n"

android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

3. Dan tambahkan pada file MainActivity.java sehingga menjadi sebagai berikut import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.DataInputStream; import java.io.DataOutputStream;

(8)

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;

public class MainActivity extends AppCompatActivity { EditText nama, telepon;

TextView dataTelepon; Button tombolInput;

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);

//penghubung antara objek dalam java dengan layout nama = (EditText) findViewById(R.id.editNama); telepon = (EditText) findViewById(R.id.editTelepon); dataTelepon = (TextView) findViewById(R.id.textDataTelp); tombolInput = (Button) findViewById(R.id.buttonInput);

//event pada tombol

tombolInput.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

//menyiapkan buffer

byte[] bufferNama = new byte[30]; byte[] bufferTelepon = new byte[15];

//menyalin data ke buffer

salinData(bufferNama, nama.getText().toString()); salinData(bufferTelepon, telepon.getText().toString());

//proses menyimpan file ke internal memori try{

//menyiapkan file di memori internal

FileOutputStream dataFile = openFileOutput("telepon.dat", MODE_APPEND); DataOutputStream output = new DataOutputStream(dataFile);

//menyimpan data

output.write(bufferNama); output.write(bufferTelepon);

//menutup file dataFile.close();

//menampilkan pesan jika data tersimpan

Toast.makeText(getBaseContext(), "Data telah disimpan", Toast.LENGTH_LONG).show();

}

catch (IOException e){

Toast.makeText(getBaseContext(), "Kesalahan: " + e.getMessage(), Toast.LENGTH_LONG).show(); } tampilkanData(); } }); tampilkanData(); }

public void salinData(byte[] buffer, String data) { //mengosongkan buffer

for (int i = 0; i < buffer.length; i++) buffer[i] = 0;

//menyalin data ke buffer

(9)

buffer[i] = (byte) data.charAt(i); }

public void tampilkanData() { try {

// menyiapkan file untuk dibaca

FileInputStream dataFile = openFileInput("telepon.dat"); DataInputStream input = new DataInputStream(dataFile);

//menyiapkan buffer

byte[] bufNama = new byte[30]; byte[] bufTelepon = new byte[15];

String infoData = "Data Telepon:\n";

//proses membaca data

while (input.available() > 0) { input.read(bufNama);

input.read(bufTelepon);

String dataNama = "";

for (int i = 0; i < bufNama.length; i++) dataNama = dataNama + (char) bufNama[i];

String dataTelepon = "";

for (int i = 0; i < bufTelepon.length; i++)

dataTelepon = dataTelepon + (char) bufTelepon[i];

//format menampilkan data

infoData = infoData + " > " + dataNama + " - " + dataTelepon + "\n";

}

//menampilkan data ke teks view dataTelepon.setText(infoData); dataFile.close();

}

catch (IOException e) {

Toast.makeText(getBaseContext(), "Kesalahan: " + e.getMessage(), Toast.LENGTH_LONG).show();

} }

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu);

return true; }

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId();

//noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true;

}

return super.onOptionsItemSelected(item); }

}

4. Tambahkan permission untuk menyimpan file di AndroidManifest

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

(10)

D. LATIHAN

Latihan diberikan oleh dosen pengampu pada saat praktikum.

Dikerjakan di laboratorium pada jam praktikum.

E. TUGAS

Tugas diberikan oleh dosen pengampu pada akhir praktikum.

Referensi

Dokumen terkait

Untuk melihat perbandingan penggunaan fisik antara input luar (eksternal) dan input dalam (internal) dalam aktivitas usahatani di lahan usaha dan di lahan pekarangan yang

Saat yang sama, ponsel para guru pun bergetar kecuali milik kepala sekolah dan mereka melihat pesan yang sampai.. Saat itu mereka terkejut melihat

[r]

Dikarenakan penilaian terhadap suatu kawasan wisata memiliki peranan yang dapat menentukan pengembangan dari tempat wisata itu sendiri yang mencakup berbagai faktor yang

Sejalan dengan penelitian Djaja dkk (2009), mengatakan risiko kematian neonatal akan meningkat pada keluarga dengan tingkat pendapatan menengah ke bawah dan penelitian Kim

(1) Dalam rangka pengembangan sistem statistik nasional, masyarakat sebagaimana dimaksud dalam pasal 13 ayat (1) wajib memberitahukan sinopsis kegiatan statistik

4,6 Dari data hasilstudipendahuluanpeneliti, didapatkan data hasil data rekam medik di Rumah Sakit Umum Daerah Ulin, Banjarmasin, Kalimantan Selatan, total pasien

Tidak ada perbedaan kecenderungan burnout ditinjau dari usia dewasa dijelaskan oleh Anoraga (2005) menyatakan bahwa dalam meniti karier, perempuan dan laki