Android External Storage – Datei lesen, schreiben, speichern

Android-externer Speicher kann zum Schreiben und Speichern von Daten, zum Lesen von Konfigurationsdateien usw. verwendet werden. Dieser Artikel ist eine Fortsetzung des Tutorials zum Android-Internen Speicher in der Reihe von Tutorials zur strukturierten Datenspeicherung in Android.

Android-Externer Speicher

Auf dem externen Speicher wie einer SD-Karte können auch Anwendungsdaten gespeichert werden, es wird keine Sicherheit für die gespeicherten Dateien auf dem externen Speicher gewährleistet. Im Allgemeinen gibt es zwei Arten von externem Speicher:

  • Primärer Externer Speicher: Integrierter gemeinsam genutzter Speicher, der „vom Benutzer durch Anschließen eines USB-Kabels und Einbinden als Laufwerk auf einem Hostcomputer zugänglich ist“. Beispiel: Wenn wir Nexus 5 32 GB sagen.
  • Sekundärer Externer Speicher: Wechselbarer Speicher. Beispiel: SD-Karte

Alle Anwendungen können Dateien auf dem externen Speicher lesen und schreiben, und der Benutzer kann sie entfernen. Wir müssen überprüfen, ob die SD-Karte verfügbar ist und ob wir darauf schreiben können. Erst nachdem wir überprüft haben, dass der externe Speicher verfügbar ist, können wir darauf schreiben, sonst wird die Speichertaste deaktiviert.

Beispielprojektstruktur für Android-externen Speicher

Zunächst müssen wir sicherstellen, dass die Anwendung die Berechtigung zum Lesen und Schreiben von Daten auf die SD-Karte des Benutzers hat. Öffnen Sie dazu die AndroidManifest.xml und fügen Sie die folgenden Berechtigungen hinzu:

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

Außerdem kann der externe Speicher durch den Benutzer blockiert sein, indem er ihn als USB-Speichergerät eingebunden hat. Daher müssen wir überprüfen, ob der externe Speicher verfügbar ist und nicht schreibgeschützt ist.

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() ist eine statische Methode von Environment, um festzustellen, ob der externe Speicher derzeit verfügbar ist oder nicht. Wie Sie sehen können, haben wir den Speichern-Button deaktiviert, wenn die Bedingung falsch ist.

Beispielcode für Android-externen Speicher

Das Layout activity_main.xml ist wie folgt definiert:

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

Hier zeigen wir neben den Buttons zum Speichern und Lesen von externem Speicher die Antwort des Speicherns/Lesens von externem Speicher in einem Textview an, im Gegensatz zum vorherigen Tutorial, wo Android Toast angezeigt wurde. Die MainActivity.java-Klasse ist wie folgt:

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(): gibt den Pfad zum internen SD-Mount-Punkt zurück, wie z.B. „/mnt/sdcard“
  2. getExternalFilesDir(): Gibt den Pfad zum Ordner „files“ innerhalb von Android/data/data/application_package/ auf der SD-Karte zurück. Es wird verwendet, um beliebige Dateien für Ihre App zu speichern (wie Bilder, die aus dem Web heruntergeladen wurden, oder Cache-Dateien). Sobald die App deinstalliert wird, werden alle in diesem Ordner gespeicherten Daten ebenfalls gelöscht.

Auch wenn der externe Speicher nicht verfügbar ist, deaktivieren wir die Schaltfläche „Speichern“ mithilfe der zuvor in diesem Tutorial diskutierten Bedingung. Unten sehen Sie unsere Anwendung, die im Android-Emulator läuft, wo wir Daten in eine Datei schreiben und sie dann lesen. Hinweis: Stellen Sie sicher, dass Ihr Android-Emulator so konfiguriert ist, dass er eine SD-Karte hat, wie im Bildfenster des AVD unten gezeigt. Gehen Sie zu Tools->Android->Android Virtual Device, bearbeiten Sie die Konfigurationen->Erweiterte Einstellungen anzeigen. Damit endet dieses Tutorial. Im nächsten Tutorial werden wir die Speicherung mit den Shared Preferences besprechen. Sie können das endgültige Beispielprojekt für den externen Speicher von Android über den unten stehenden Link herunterladen.

Android External Storage Beispielprojekt herunterladen

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