אחסון חיצוני ב-Android – קריאה, כתיבה, שמירת קובץ

האחסון החיצוני של Android ניתן לשימוש לכתיבה ולשמירת נתונים, קריאת קבצי הגדרה וכדומה. מאמר זה הוא המשך למדריך אחסון פנימי של Android בסדרת המדריכים על אחסון נתונים מבונה ב-Android.

אחסון חיצוני של Android

אחסון חיצוני כגון כרטיס SD יכול גם לשמור נתוני אפליקציה, אין אף הגבלת אבטחה על הקבצים שאתה שומר באחסון החיצוני. בכלל ישנם שני סוגים של אחסון חיצוני:

  • אחסון חיצוני ראשי: אחסון משותף מובנה ש"נגיש על ידי המשתמש על ידי חיבור כבל USB והרכבתו כמנה של מחשב מארח". לדוגמה: כאשר אנו אומרים Nexus 5 בנפח 32 ג'יגה-בייט.
  • אחסון חיצוני משני: אחסון נייד. לדוגמה: כרטיס SD

כל היישומים יכולים לקרוא ולכתוב קבצים שמונחים באחסון החיצוני והמשתמש יכול להסיר אותם. עלינו לבדוק אם הכרטיס SD זמין ואם ניתן לכתוב אליו. לאחר שבדקנו שהאחסון החיצוני זמין רק אז נוכל לכתוב אליו אחרת הלחצן לשמירה יהיה מושבת.

מבנה פרויקט לדוגמה של אחסון חיצוני של Android

ראשית, עלינו לוודא שהיישום יש אישור לקרוא ולכתוב נתונים לכרטיס ה-SD של המשתמש, לכן נפתח את AndroidManifest.xml ונוסיף את ההרשאות הבאות:

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

בנוסף, ייתכן כי האחסון החיצוני יהיה קשור לכך שהמשתמש מחובר אותו כמכשיר אחסון USB. לכן עלינו לבדוק האם האחסון החיצוני זמין ולא לקריאה בלבד.

if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {  
   saveButton.setEnabled(false);
  }  

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

getExternalStorageState() הוא שיטה סטטית של Environment לקביעה האם האחסון החיצוני זמין כרגע או לא. כפי שניתן לראות, אם התנאי אינו נכון, השבתנו את לחצן השמירה.

קוד דוגמה לאחסון חיצוני של Android

תבנית ה-activity_main.xml מוגדרת כך:

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

    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Reading and Writing to External Storage"
        android:textSize="24sp"/>

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

        <requestFocus />
    </EditText>

    <LinearLayout
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:orientation="horizontal"
        android:weightSum="1.0"
        android:layout_marginTop="20dp">

    <Button android:id="@+id/saveExternalStorage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="SAVE"
        android:layout_weight="0.5"/>

    <Button android:id="@+id/getExternalStorage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:text="READ" />

    </LinearLayout>

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

</LinearLayout>

הנה, מלבד כפתורי השמירה והקריאה מאחסון חיצוני, אנו מציגים את התגובה של השמירה/קריאה ל/מאחסון חיצוני ב־TextView, להבחנה מהמדריך הקודם שבו נראה תרומת אנדרואיד. מחלקת MainActivity.java מוצגת למטה:

package com.journaldev.externalstorage;

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.app.Activity;
import android.os.Environment;
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 {
    EditText inputText;
    TextView response;
    Button saveButton,readButton;

    private String filename = "SampleFile.txt";
    private String filepath = "MyFileStorage";
    File myExternalFile;
    String myData = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        inputText = (EditText) findViewById(R.id.myInputText);
        response = (TextView) findViewById(R.id.response);


         saveButton =
                (Button) findViewById(R.id.saveExternalStorage);
        saveButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    FileOutputStream fos = new FileOutputStream(myExternalFile);
                    fos.write(inputText.getText().toString().getBytes());
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                inputText.setText("");
                response.setText("SampleFile.txt saved to External Storage...");
            }
        });

        readButton = (Button) findViewById(R.id.getExternalStorage);
        readButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                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();
                }
                inputText.setText(myData);
                response.setText("SampleFile.txt data retrieved from Internal Storage...");
            }
        });

        if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {
            saveButton.setEnabled(false);
        }
        else {
            myExternalFile = new File(getExternalFilesDir(filepath), filename);
        }


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

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


}
  1. Environment.getExternalStorageState(): מחזירה את הנתיב לנקודת ההרכבה הפנימית כמו "/mnt/sdcard"
  2. getExternalFilesDir(): מחזירה את הנתיב לתיקיית קבצים בתוך Android/data/data/application_package/ בכרטיס ה-SD. נעשה בה שימוש לאחסון קבצים דרושים לאפליקציה שלך (כמו תמונות שהורדו מהאינטרנט או קבצי מטמון). לאחר ההסרה של האפליקציה, כל הנתונים שנשמרו בתיקייה זו נמחקים גם.

גם אם אחסון חיצוני אינו זמין אנחנו משביתים את כפתור השמירה באמצעות התנאי שנדונה במדריך הקודם. למטה יש את היישום שלנו רץ במודל האנדרואיד, שבו אנחנו כותבים נתונים לקובץ ואז קוראים אותם. הערה: ודא שהאמולטור שלך מוגדר עם כרטיס SD כפי שמופיע בדיאלוג של התצורה של AVD למטה. עבור לכלי->אנדרואיד->התצורה הווירטואלית של אנדרואיד, ערוך תצורות->הצג הגדרות מתקדמות. זה מסיים את המדריך הזה. נדון באחסון באמצעות הגדרות מועדפות משותפות במדריך הבא. באפשרותך להוריד את פרויקט מערכת האנדרואיד החיצונית הסופית מהקישור למטה.

הורדת פרויקט מערכת האנדרואיד החיצונית לדוגמה

Source:
https://www.digitalocean.com/community/tutorials/android-external-storage-read-write-save-file