Praktikum 4 – Penyimpanan Data (Part 2)

Pada post kali ini akan melanjutkan dari praktikum sebelumnya yaitu tentang penyimpanan eksternal. Untuk penyimpanan eksternal ini ditemukan hal yang cukup menarik, selengkapnya sebagai berikut:

Penyimpanan eksternal adalah penyimpanan diluar aplikasi atau bisa dikatakan penyimpanan file di luar folder project (App). Penyimpanan eksternal membutuhkan hak akses untuk membaca dan menambahkan file di storage handphone, baik di storage eksternal seperti SD Card maupun di Storage internal handphone. Sistem hak akses (App permissions) pada versi android tertentu ada yang berbeda dengan versi dibawahnya. Untuk Android 5.1.0 (Lolipop) kebawah semua hak akses dicek pada awal aplikasi dibuka sedangkan untuk Android 6.0.0 (Marshmallow) keatas hak akses hanya akan dicek ketika dibutuhkan. Hal ini mempengaruhi cara bagaimana mendapatkan hak akses untuk penyimpanan eksternal.

  • Pada Android 5.1.0 (Lolipop) kebawah

Kita akan menggunakan project pada praktikum sebelumnya, yang diedit pada SecondActivity.java sehingga penyimpanan menggunakan penyimpanan eksternal.

1. Menambahkan method isExternalStorageWritable untuk mengecek apakah sudah mendapatkan hak akses untuk membuat file di eksternal storage:

public boolean isExternalStorageWritable(){
    if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
        return true;
    }
    else return false;
}

2. Menambahkan method isExternalStorageReadable untuk mengecek apakah sudah mendapatkan hak akses untuk membaca file di eksternal storage:

public boolean isExternalStorageReadable(){
    if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(Environment.getExternalStorageState())){
        return true;
    }
    else return false;
}

3. pada method writeFile diubah menjadi :

if(isExternalStorageWritable()){
    try{
        File textFile = new File(Environment.getExternalStorageDirectory(), FILENAME);
        FileOutputStream fileOutputStream = new FileOutputStream(textFile);
        fileOutputStream.write(mEditText.getText().toString().getBytes());
        fileOutputStream.close();
    }
    catch (java.io.IOException e){
        e.printStackTrace();
        Toast.makeText(this, "Error writing file", Toast.LENGTH_LONG).show();
    }
}

4. pada method readFile diubah menjadi:

if(isExternalStorageReadable()){
    StringBuilder stringBuilder = new StringBuilder();
    try{
        File textFile = new File(Environment.getExternalStorageDirectory(), FILENAME);
        FileInputStream fileInputStream = new FileInputStream(textFile);
        if(fileInputStream != null){
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String newLine = null;
            while((newLine = bufferedReader.readLine()) != null){
                stringBuilder.append(newLine+"\n");
            }
            fileInputStream.close();
        }
        mEditText.setText(stringBuilder);
    }
    catch (java.io.IOException e){
        e.printStackTrace();
        Toast.makeText(this, "Error reading file", Toast.LENGTH_LONG).show();
    }
}
else {
    Toast.makeText(this, "Cannot read External Storage", Toast.LENGTH_LONG).show();
}

Kemudian pada file AndroidManifest.xml yang berada di dalam folder manifests ditambahkan :

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

Ketika aplikasi dijalankan dan menyimpan suatu kalimat atau kata maka kalimat atau kata tersebut akan disimpan sebagai testFile.txt di internal storage:

Ketika kita menjalankan Aplikasi ini pada android 6.0.0 keatas maka akan keluar error karena hak akses akan didapatkan hanya ketika dibutuhkan:

  • Pada Android 6.0.0 (Marshmallow) keatas

Untuk penyimpanan eksternal pada Android 6.0.0 keatas saya masih menemukan error karena belum berhasil mendapatkan hak akses ke penyimpanan eksternal. Saya buat ke dalam project baru, untuk code yang saya buat sebagai berikut:

1. Pada MainAcitvity.java

package com.stordat.storedata2;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {
    private final String FILENAME="testFile.txt";
    private final int REQUEST_WRITE_EXTERNAL_STORAGE = -1;
    EditText mEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEditText = findViewById(R.id.editText1);
    }

    public boolean isExternalStorageWritable(){
        if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
            return true;
        }
        else return false;
    }

    public boolean isExternalStorageReadable(){
        if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(Environment.getExternalStorageState())){
            return true;
        }
        else return false;
    }

    public void writeFile(View view){
        if(isExternalStorageWritable()){
            try{
                File textFile = new File(Environment.getExternalStorageDirectory(), FILENAME);
                FileOutputStream fileOutputStream = new FileOutputStream(textFile);
                fileOutputStream.write(mEditText.getText().toString().getBytes());
                fileOutputStream.close();
            }
            catch (java.io.IOException e){
                e.printStackTrace();
                Toast.makeText(this, "Error writing file", Toast.LENGTH_LONG).show();
            }
        }
        else{
            if(shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
                Toast.makeText(this, "Need External Storage Permission", Toast.LENGTH_SHORT).show();
            }

            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_EXTERNAL_STORAGE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permission[], int[] grantResults){
        switch (requestCode){
            case REQUEST_WRITE_EXTERNAL_STORAGE:{
                if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(this, "Alhamdulillah", Toast.LENGTH_SHORT).show();
                }
                else{
                    Toast.makeText(this, "Ooooh jadi belum boleh", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

    public void readFile(View view){
        if(isExternalStorageReadable()){
            StringBuilder stringBuilder = new StringBuilder();
            try{
                File textFile = new File(Environment.getExternalStorageDirectory(), FILENAME);
                FileInputStream fileInputStream = new FileInputStream(textFile);
                if(fileInputStream != null){
                    InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                    String newLine = null;
                    while((newLine = bufferedReader.readLine()) != null){
                        stringBuilder.append(newLine+"\n");
                    }
                    fileInputStream.close();
                }
                mEditText.setText(stringBuilder);
            }
            catch (java.io.IOException e){
                e.printStackTrace();
                Toast.makeText(this, "Error reading file", Toast.LENGTH_LONG).show();
            }
        }
        else {
            Toast.makeText(this, "Cannot read External Storage", Toast.LENGTH_LONG).show();
        }
    }
}

2. Pada activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:layout_editor_absoluteY="81dp">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText1"
        android:inputType="textMultiLine"
        android:ems="10"
        android:layout_above="@+id/buttonRead"
        android:layout_centerHorizontal="true"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Read"
        android:id="@+id/buttonRead"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:onClick="readFile"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Write"
        android:id="@+id/buttonWrite"
        android:layout_below="@+id/buttonRead"
        android:layout_centerHorizontal="true"
        android:onClick="writeFile"
        />

</RelativeLayout>

3. Pada AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.stordat.storedata2">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Screenshot aplikasi

Leave a Reply

Your email address will not be published. Required fields are marked *