12/08/2018, 14:01

Lập trình android với bộ nhớ ngoài (External Storage)

Ở bài trước tôi đã giới thiệu đến các bạn lập trình android với bộ nhớ trong. Hôm nay tôi sẽ tiếp tục giới thiệu với các bạn lập trình android với bộ nhớ ngoài. External Storage là nơi lưu trữ dữ liệu ngoài của Android, các file dữ liệu lưu trữ mà bạn lưu trữ tại đây không được hệ thống áp dụng ...

Ở bài trước tôi đã giới thiệu đến các bạn lập trình android với bộ nhớ trong. Hôm nay tôi sẽ tiếp tục giới thiệu với các bạn lập trình android với bộ nhớ ngoài.

External Storage là nơi lưu trữ dữ liệu ngoài của Android, các file dữ liệu lưu trữ mà bạn lưu trữ tại đây không được hệ thống áp dụng bảo mật.

Thông thường có 2 loại lưu trữ ngoài (External Storage) là lưu trữ ngoài tại ổ cứng điện thoại và lưu trữ tại ổ cứng lưu động như thẻ nhớ (SD card). Dữ liệu được tạo ra sẽ không bị ràng buộc bởi ứng dụng, khi ta xóa ứng dụng tạo ra dữ liệu tại bộ nhớ ngoài thì dữ liệu đó không bị mất đi.

Trong bài học này chúng ta sẽ làm một ví dụ cơ bản để lưu trữ một chuỗi văn bản vào bộ nhớ ngoài tại SDcard và đọc dữ liệu đó rồi hiện lên màn hình.

Đầu tiên chúng ta sẽ tạo một project mới với MainActivity ở dạng EmptyActivity. Ở bài này mình tạo project có tên ExternalStorageExample.

Chúng ta sẽ tạo giao diện cho MainActivity tại file activity_main.xml bao gồm một TextView để hiển thị thông báo lưu hoặc đọc dữ liệu, một EditText để nhập chuỗi ký tự lưu vào, 2 Button để nhấn sự kiện lưu dữ liệu và đọc dữ liệu lên.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_awidth = "fill_parent"
    android:layout_height = "fill_parent"
    android:orientation = "vertical"
    android:gravity = "center">

    <TextView
        android:gravity = "center"
        android:layout_awidth = "fill_parent"
        android:layout_height = "wrap_content"
        android:text = "Lưu trữ file vào bộ nhớ" />

    <EditText
        android:id = "@+id/myInputText"
        android:layout_awidth = "match_parent"
        android:layout_height = "wrap_content"
        android:ems = "10"
        android:gravity = "top|left"
        android:inputType = "textMultiLine"
        android:lines = "5"
        android:minLines = "3">
        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/btnSave"
        android:layout_awidth = "match_parent"
        android:layout_height = "wrap_content"
        android:text = "Lưu vào bộ nhớ ngoài" />

    <Button
        android:id = "@+id/btnDisplay"
        android:layout_awidth = "match_parent"
        android:layout_height = "wrap_content"
        android:text = "Lấy dữ liệu từ bộ nhớ ngoài" />

    <TextView
        android:id = "@+id/responseText"
        android:layout_awidth = "wrap_content"
        android:layout_height = "wrap_content"
        android:padding = "5dp"
        android:text = ""
        android:textAppearance = "?android:attr/textAppearanceMedium" />
</LinearLayout>

Tiếp theo trong class MainActivity ta viết hàm kiểm tra xem thiết bị có bộ nhớ ngoài hay không và kiểm tra bộ nhớ ngoài đó có read only (Không cho phép ghi dữ liệu) Hai trường hợp này đều dẫn tới việc không thể ghi dữ liệu lên đó được. Sau đó xét trường hợp thỏa mãn ghi được dữ liệu ta sẽ tạo một file có tên là MySampleFile.txt và một thư mục MyFileStorage.

/*
 * Kiểm tra xe bộ nhớ ngoài SDCard có readonly không vì nếu là readonly thì
 * không thể tạo file trên đó được
 */

private static boolean isExternalStorageReadOnly() {
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
        return true;
    }
    return false;
}

 /*
 * Kiểmtra xem device có bộ nhớ ngoài không
 */
private static boolean isExternalStorageAvailable() {
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
        return true;
    }
    return false;
}

Trong hàm onCreate() ta thêm dòng lệnh kiểm tra bộ nhớ và tạo file:

onCreate() được sửa lại như sau:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    // check if external storage is available and not read only
    if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {
        btnSave.setEnabled(false);
    } else {
        myExternalFile = new File(getExternalFilesDir(filepath), filename);
    }

}

Khi đã tạo được file ta bắt sự kiện cho 2 nút lưu và đọc file:

public void onClick(View v) {

    String myData = "";
    switch (v.getId()) {
        case R.id.btnSave:
            try {
                FileOutputStream fos = new FileOutputStream(myExternalFile);
                fos.write(myInputText.getText().toString().getBytes());
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            myInputText.setText("");
            responseText.setText("Dữ liệu đã được lưu vào bộ nhớ ngoài");
            break;

        case R.id.btnDisplay:
            try {
                FileInputStream fis = new FileInputStream(myExternalFile);
                DataInputStream in = new DataInputStream(fis);
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(in));
                String strLine;
                while ((strLine = br.readLine()) != null) {
                    myData = myData + strLine;
                }
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            myInputText.setText(myData);
            responseText.setText("Được lấy ra từ bộ nhớ ngoài");
            break;
    }
}

Vậy là xong, toàn bộ code tại MainActivity như sau:

package com.example.dong.devpro_external_storage;

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

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
    Button btnSave, readFromExternalStorage;
    private String filename = "MySampleFile.txt";
    private String filepath = "MyFileStorage";
    TextView responseText;
    EditText myInputText;
    File myExternalFile;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        // check if external storage is available and not read only
        if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {
            btnSave.setEnabled(false);
        } else {
            myExternalFile = new File(getExternalFilesDir(filepath), filename);
        }

    }

    private void initView() {
        myInputText = (EditText) findViewById(R.id.myInputText);
        responseText = (TextView) findViewById(R.id.responseText);
        btnSave = (Button) findViewById(R.id.btnSave);
        btnSave.setOnClickListener(this);
        readFromExternalStorage = (Button) findViewById(R.id.btnDisplay);
        readFromExternalStorage.setOnClickListener(this);
    }
    public void onClick(View v) {

        String myData = "";
        switch (v.getId()) {
            case R.id.btnSave:
                try {
                    FileOutputStream fos = new FileOutputStream(myExternalFile);
                    fos.write(myInputText.getText().toString().getBytes());
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                myInputText.setText("");
                responseText.setText("Dữ liệu đã được lưu vào bộ nhớ ngoài");
                break;

            case R.id.btnDisplay:
                try {
                    FileInputStream fis = new FileInputStream(myExternalFile);
                    DataInputStream in = new DataInputStream(fis);
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(in));
                    String strLine;
                    while ((strLine = br.readLine()) != null) {
                        myData = myData + strLine;
                    }
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                myInputText.setText(myData);
                responseText.setText("Được lấy ra từ bộ nhớ ngoài");
                break;
        }
    }

    /*
     * Kiểm tra xe bộ nhớ ngoài SDCard có readonly không vì nếu là readonly thì
     * không thể tạo file trên đó được
     */
    private static boolean isExternalStorageReadOnly() {
        String extStorageState = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
            return true;
        }
        return false;
    }

     /*
     * Kiểmtra xem device có bộ nhớ ngoài không
     */
    private static boolean isExternalStorageAvailable() {
        String extStorageState = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
            return true;
        }
        return false;
    }
}

Ta chạy chương trình và xem kết quả

Vậy là tôi đã giới thiệu xong đến các bạn Lập trình Android với bộ nhớ ngoài.

Chúc các bạn code vui vẻ!!!! ^_^

0