Ecriture sur carte SD externe
Bonjour,
J'ai un Galaxy S5, Android 5.1, connecté à mon PC en usb, donc je teste directement. J'utilise Android Studio.
J'ai créé une appli qui doit stocker des images sur la carte SD externe.
Dans mon manifeste, j'ai mis l'autorisation:
Code:
1 2
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
Je crée le fichier en utilisant le chemin de la SD externe:
Code:
1 2
|
File f = new File(Environment.getExternalStorageDirectory()+ File.separator + "test8.jpg"); |
Au final, il écrit dans la mémoire interne sur la "racine".
En visualisant le contenu du chemin j'ai ceci: "/storage/emulated/0/test8.jpg".
Je suppose que cela vient du "réglage" d'Android Studio ou bien faut-il que l'appli soit sur la carte SD externe ?
Merci pour votre aide.
J'ai le même problème non résolu.
Bonjour,
Depuis un certain temps je n'arrive plus à écrire sur la carte externe de mon smartphone (Galaxy Note 2 - Android 4.4.2). Il semble en effet que ce ne soit plus possible depuis les applis d'utilisateurs ordinaires.
Je vous soumets un petit programme simple et complet de test d'écriture de fichiers, en espérant que quelqu'un pourra nous faire progresser, ou nous confirmer qu'il n'y a rien à espérer pour le moment.
Dans ce programme j'écris un petit texte d'abord dans un fichier bidon1.txt dans la zone externe privée, puis un fichier bidon2.txt dans la zone externe publique, puis un fichier bidon3.txt sur la carte externe (supplémentaire).
Les 2 premiers sont bien écrits, mais il y a échec de création du troisième.
(Tout ceci ne concerne que l'accès en écriture car en lecture il n'y a pas de problème).
Vous trouverez ci-après le source java de l'activité (pas de layout.xml), le manifeste, la sortie d'un Log et une session adb shell de vérification avec laquelle on arrive à créer sans problème des fichiers sur la carte externe.
Source java de l'activité :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| package fr.llibre.testwrite;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String texte = "Test n°4 écriture dans divers fichiers.\n";
// Test écriture dans la mémoire externe privée
File dirExtPriv = getExternalFilesDir(null); // Le répertoire parent externe privé de l'appli
File fichBidon1 = new File(dirExtPriv, "bidon1.txt"); // Un fichier texte bidon
texte += "Ecriture fichier " + fichBidon1.getAbsolutePath() + " (répertoire ext. privé).\n";
try {
FileWriter fw = new FileWriter(fichBidon1); // On crée le fichier en mode écriture
try {
fw.write(texte, 0, texte.length()); // On l'écrit dans le fichier
fw.close(); // On le ferme.
texte += "L'écriture semble avoir réussie.\n";
} catch (IOException e) { texte += "L'écriture a échouée !\n"; fw.close();}
} catch (IOException e) { texte += "Echec ouverture du fichier !\n";}
// Test écriture dans la mémoire externe publique
File dirExtPub = Environment.getExternalStorageDirectory();
File fichBidon2 = new File(dirExtPub, "bidon2.txt"); // Un fichier texte bidon
texte += "Ecriture fichier " + fichBidon2.getAbsolutePath() + " (répertoire ext. public).\n";
try {
FileWriter fw = new FileWriter(fichBidon2); // On crée le fichier en mode écriture
try {
fw.write(texte, 0, texte.length()); // On l'écrit dans le fichier
fw.close(); // On le ferme.
texte += "L'écriture semble avoir réussie.\n";
} catch (IOException e) { texte += "L'écriture a échouée !\n"; fw.close();}
} catch (IOException e) { texte += "Echec ouverture du fichier !\n";}
// Test écriture sur la carte externe
String extSdCardPath = System.getenv("SECONDARY_STORAGE");
if(!TextUtils.isEmpty(extSdCardPath))
{
File extSdCard = new File(extSdCardPath);
if (extSdCard.isDirectory())
{
texte += "On a une carte externe d'adresse " + extSdCardPath +"\n";
File fichBidon3 = new File(extSdCard, "bidon3.txt");
texte += "Ecriture fichier " + fichBidon3.getAbsolutePath() + "(carte externe).\n";
try {
FileWriter fw = new FileWriter(fichBidon3); // On crée le fichier en mode écriture
try {
fw.write(texte, 0, texte.length()); // On l'écrit dans le fichier
fw.close(); // On le ferme.
texte += "L'écriture semble avoir réussie.\n";
} catch (IOException e) { texte += "L'écriture a échouée !\n"; fw.close();}
} catch (IOException e) { texte += "Echec ouverture du fichier !\n";}
}
}
Log.i(getClass().getName(), texte);
// On affiche le résultat sur le smartphone
LinearLayout layout = new LinearLayout(this);
TextView textView = new TextView(this);
textView.setText(texte);
layout.addView(textView);
setContentView(layout);
}
} |
Manifeste Android
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="fr.llibre.testwrite" >
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest> |
Ci-dessous la sortie du Log, montre que toutes les écritures ont réussies sauf celle sur la carte externe :
Code:
1 2 3 4 5 6 7 8
| Test n°4 écriture dans divers fichiers.
Ecriture fichier /storage/emulated/0/Android/data/fr.llibre.testwrite/files/bidon1.txt (répertoire ext. privé).
L'écriture semble avoir réussie.
Ecriture fichier /storage/emulated/0/bidon2.txt (répertoire ext. public).
L'écriture semble avoir réussie.
On a une carte externe d'adresse /storage/extSdCard
Ecriture fichier /storage/extSdCard/bidon3.txt(carte externe).
Echec ouverture du fichier ! |
La session shell ci-dessous, effectuée sur le smartphone avec adb, montre que le fichier bidon2.txt a bien été écrit. On remarquera que depuis ce shell l'accès au répertoire /storage/emulated/0 se fait par le chemin /mnt/shell/emulated/0.
Il n'y a pas de trace du fichier bidon3.txt dans /storage/extSdCard car l'appli n'a pas réussi à le créer. Par contre avec ce shell on crée ci-dessous le fichier /storage/extSdCard/bidon0.txt, puis on le lit, puis on le détruit, sans problème.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| E:\temp>adb shell
shell@t03g:/ $ ls -l /storage/emulated
lrwxrwxrwx root root 2015-10-13 08:08 legacy -> /mnt/shell/emulated/0
shell@t03g:/ $ cat /mnt/shell/emulated/0/bidon2.txt
Test n°4 écriture dans divers fichiers.
Ecriture fichier /storage/emulated/0/Android/data/fr.llibre.testwrite/files/bidon1.txt (répertoire ext. privé).
L'écriture semble avoir réussie.
Ecriture fichier /storage/emulated/0/bidon2.txt (répertoire ext. public).
shell@t03g:/ $ ls -l /storage/extSdCard
drwxrwx--x root sdcard_r 2014-08-15 17:30 Android
drwxrwx--- root sdcard_r 2013-11-26 15:18 DCIM
drwxrwx--- root sdcard_r 2013-04-05 19:03 LOST.DIR
drwxrwx--- root sdcard_r 2015-05-20 11:31 Sounds
drwxrwx--- root sdcard_r 2015-11-26 17:32 temp
shell@t03g:/ $ cd /storage/extSdCard
shell@t03g:/storage/extSdCard $ cat > bidon0.txt
Essai ecriture sur carte externe depuis adb
shell@t03g:/storage/extSdCard $ ls -l bidon0.txt
-rwxrwx--- root sdcard_r 44 2015-11-26 21:27 bidon0.txt
shell@t03g:/storage/extSdCard $ cat bidon0.txt
Essai ecriture sur carte externe depuis adb
shell@t03g:/storage/extSdCard $ rm bidon0.txt
shell@t03g:/storage/extSdCard $ ls -l bidon0.txt
bidon0.txt: No such file or directory
1|shell@t03g:/storage/extSdCard $ exit |
Remarque :
Même le gestionnaire de fichier ES Explorateur échoue à déplacer les fichiers vers la carte externe. Il semble que pour le moment la seule possibilité soit de passer par l'intermédiaire de la liaison usb avec un PC (ou autre).
Cordialement à tous.