Le stockage externe d’Android peut être utilisé pour écrire et sauvegarder des données, lire des fichiers de configuration, etc. Cet article est la suite du tutoriel Stockage interne d’Android dans la série de tutoriels sur le stockage de données structurées dans Android.
Stockage externe d’Android
Le stockage externe tel que la carte SD peut également stocker des données d’application, aucune sécurité n’est imposée aux fichiers que vous enregistrez sur le stockage externe. En général, il existe deux types de stockage externe :
- Stockage externe primaire : Stockage partagé intégré qui est « accessible par l’utilisateur en branchant un câble USB et en le montant comme un lecteur sur un ordinateur hôte ». Exemple : Quand nous disons Nexus 5 32 Go.
- Stockage externe secondaire : Stockage amovible. Exemple : Carte SD
Toutes les applications peuvent lire et écrire des fichiers placés sur le stockage externe et l’utilisateur peut les supprimer. Nous devons vérifier si la carte SD est disponible et si nous pouvons y écrire. Une fois que nous avons vérifié que le stockage externe est disponible, alors seulement nous pouvons y écrire sinon le bouton de sauvegarde serait désactivé.
Exemple de structure de projet de stockage externe Android
Tout d’abord, nous devons nous assurer que l’application a l’autorisation de lire et écrire des données sur la carte SD de l’utilisateur. Ouvrons le fichier
AndroidManifest.xml
et ajoutons les autorisations suivantes :
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
De plus, le stockage externe peut être occupé si l’utilisateur l’a monté en tant que périphérique de stockage USB. Nous devons donc vérifier si le stockage externe est disponible et n’est pas en lecture seule.
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()
est une méthode statique de Environment
pour déterminer si le stockage externe est actuellement disponible ou non. Comme vous pouvez le voir, si la condition est fausse, nous avons désactivé le bouton de sauvegarde.
Code d’exemple de stockage externe Android
La disposition de activity_main.xml est définie comme suit:
<?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>
Voici le texte traduit en français, en respectant vos balises personnalisées :
« Ici, en dehors des boutons de sauvegarde et de lecture depuis le stockage externe, nous affichons la réponse de la sauvegarde/lecture vers/depuis un stockage externe dans un textview, contrairement au tutoriel précédent où le toast Android était affiché. La classe MainActivity.java est donnée ci-dessous :
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;
}
}
- Environment.getExternalStorageState() : renvoie le chemin vers le point de montage SD interne comme « /mnt/sdcard »
- getExternalFilesDir() : Il renvoie le chemin vers le dossier de fichiers à l’intérieur de Android/data/data/application_package/ sur la carte SD. Il est utilisé pour stocker tous les fichiers nécessaires à votre application (comme des images téléchargées depuis le web ou des fichiers de cache). Une fois que l’application est désinstallée, toutes les données stockées dans ce dossier disparaissent également. »
Aussi, si le stockage externe n’est pas disponible, nous désactivons le bouton de sauvegarde en utilisant la condition if qui a été discutée précédemment dans ce tutoriel. Ci-dessous se trouve notre application en cours d’exécution dans l’émulateur Android, où nous écrivons des données dans un fichier puis les lisons. Note: Assurez-vous que votre émulateur Android est configuré de manière à avoir une carte SD comme le montre la boîte de dialogue de l’AVD ci-dessous. Allez dans Outils -> Android -> Appareil virtuel Android, modifiez les configurations -> Afficher les paramètres avancés.
Cela marque la fin de ce tutoriel. Nous discuterons du stockage en utilisant les préférences partagées dans le prochain tutoriel. Vous pouvez télécharger le projet final de stockage externe Android à partir du lien ci-dessous.
Source:
https://www.digitalocean.com/community/tutorials/android-external-storage-read-write-save-file