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ẻ!!!! ^_^

Bài liên quan

Lập trình Android – Bài 4: Thiết kế giao diện với RelativeLayout

Lập trình Android – Bài 4: Thiết kế giao diện với RelativeLayout Tháng Bảy 3, 2016 nguyenvanquan7826 TUT Android 5 responses Như mình đã nói ở các bài trước: Thiết kế giao diện tốt thì bạn học Android tốt, thiết kế giao diện dở ...

Bùi Văn Nam viết 2 tuần trước

Lập trình Android – Bài 5: Thiết kế giao diện với LinearLayoout

Lập trình Android – Bài 5: Thiết kế giao diện với LinearLayoout Tháng Bảy 7, 2016 nguyenvanquan7826 TUT Android 4 responses Như bài trước mình đã nói, LinearLayout là ViewGroup chứa các View khác và quản lý theo chiều ngang hoặc ...

Trần Trung Dũng viết 2 tuần trước

Các thủ thuật để giấu secret key khỏi source control và ứng dụng với CI trong lập trình Android

Xin chào các bạn. Chắc hẳn mỗi chúng ta đều đã từng phát triển app sử dụng API của bên thứ 3, và chắc mọi người đều biết là hầu hết các API service đều yêu cầu chúng ta phải có 1 API key (secret token) để verify nguồn gốc của các request. Vậy thì tại sao chúng ta lại phải "giấu" API key này khỏi ...

Vũ Văn Thanh viết 15:49 ngày 07/09/2018

Các thủ thuật để giấu secret key/password khỏi source control và ứng dụng với CI trong lập trình Android

Xin chào các bạn. Chắc hẳn mỗi chúng ta đều đã từng phát triển app sử dụng API của bên thứ 3, và chắc mọi người đều biết là hầu hết các API service đều yêu cầu chúng ta phải có 1 API key (secret token) để verify nguồn gốc của các request. Vậy thì tại sao chúng ta lại phải "giấu" API key này khỏi ...

Tạ Quốc Bảo viết 14:12 ngày 12/08/2018

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 ...

Tạ Quốc Bảo viết 14:01 ngày 12/08/2018
0