Android Externe Opslag – Bestand Lezen, Schrijven, Opslaan

Android externe opslag kan worden gebruikt om gegevens te schrijven en op te slaan, configuratiebestanden te lezen, enzovoort. Dit artikel is een vervolg op de Android Interne Opslag-handleiding in de reeks handleidingen over gestructureerde gegevensopslag in Android.

Android Externe Opslag

Externe opslag, zoals een SD-kaart, kan ook toepassingsgegevens opslaan. Er wordt geen beveiliging afgedwongen op bestanden die naar de externe opslag worden opgeslagen. Over het algemeen zijn er twee soorten externe opslag:

  • Primaire Externe Opslag: Ingebouwde gedeelde opslag die “toegankelijk is voor de gebruiker door een USB-kabel in te pluggen en het als een schijf op een hostcomputer te monteren.” Voorbeeld: Wanneer we zeggen Nexus 5 32 GB.
  • Secundaire Externe Opslag: Verwijderbare opslag. Voorbeeld: SD-kaart

Alle applicaties kunnen bestanden lezen en schrijven die op de externe opslag zijn geplaatst, en de gebruiker kan ze verwijderen. We moeten controleren of de SD-kaart beschikbaar is en of we ernaar kunnen schrijven. Pas als we hebben gecontroleerd dat de externe opslag beschikbaar is, kunnen we ernaar schrijven, anders wordt de knop Opslaan uitgeschakeld.

Voorbeeldprojectstructuur Android Externe Opslag

Allereerst moeten we ervoor zorgen dat de applicatie toestemming heeft om gegevens te lezen en schrijven naar de SD-kaart van de gebruiker. Laten we daarom het AndroidManifest.xml openen en de volgende machtigingen toevoegen:

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

Bovendien kan externe opslag worden gebruikt door de gebruiker die het heeft gemount als een USB-opslagapparaat. Dus we moeten controleren of de externe opslag beschikbaar is en niet alleen-lezen is.

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() is een statische methode van Environment om te bepalen of externe opslag op dit moment beschikbaar is of niet. Zoals je kunt zien, als de voorwaarde onwaar is, hebben we de opslaan-knop uitgeschakeld.

Voorbeeldcode voor Android Externe Opslag

De layout van activity_main.xml is als volgt gedefinieerd:

<?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 tonen we, naast de knoppen voor opslaan en lezen van externe opslag, de respons van het opslaan/lezen naar/van een externe opslag in een textview, in tegenstelling tot de vorige tutorial waar android toast werd weergegeven. De MainActivity.java-klasse ziet er als volgt uit:

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(): geeft het pad naar het interne SD-montagepunt terug zoals “/mnt/sdcard”
  2. getExternalFilesDir(): Geeft het pad terug naar de bestandenmap binnen Android/data/data/application_package/ op de SD-kaart. Het wordt gebruikt om eventuele vereiste bestanden voor uw app op te slaan (zoals afbeeldingen die zijn gedownload van internet of cachebestanden). Zodra de app is verwijderd, verdwijnen ook alle gegevens die in deze map zijn opgeslagen.

Ook als de externe opslag niet beschikbaar is, schakelen we de opslaan knop uit met behulp van de if-voorwaarde die eerder in deze tutorial werd besproken. Hieronder draait onze applicatie in de Android-emulator, waar we gegevens naar een bestand schrijven en vervolgens lezen. Opmerking: Zorg ervoor dat je Android-emulator is geconfigureerd met een SD-kaart zoals weergegeven in het dialoogvenster van AVD hieronder. Ga naar Tools -> Android -> Android Virtual Device, bewerk configuraties -> Toon geavanceerde instellingen. Hiermee komt er een einde aan deze tutorial. We zullen opslag bespreken met behulp van gedeelde voorkeuren in de volgende tutorial. Je kunt het definitieve project van Android Externe Opslag downloaden via onderstaande link.

Download Android Externe Opslag Voorbeeldproject

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