2011-08-13 6 views
0

J'ai des problèmes avec l'écriture de fichiers sur la carte SD dans l'émulateur. Voici mon code:Enregistrement d'un fichier sur la carte SD

File directory; 
directory = new File("/sdcard/b/b"); 
directory.mkdirs(); 
... 
XmlSerializer serializer = Xml.newSerializer(); 
StringWriter writer = new StringWriter(); 
serializer.setOutput(writer); 
... 
String fileName = new Date().toString(); 

FileOutputStream fOut = healthCareApplication.openFileOutput("/sdcard/b/b"+fileName+".xml",Context.MODE_WORLD_READABLE); 
OutputStreamWriter osw = new OutputStreamWriter(fOut); 
osw.write(writer.toString()); 
osw.flush(); 
osw.close(); 

Tout d'abord je créer un répertoire sur la carte SD, à côté je construis un certain fichier XML. Ensuite, j'essaie de créer un fichier et d'essayer d'enregistrer ce fichier XML dans ce répertoire, mais je reçois IllegalArgumentException et les plantages d'applications. "healthCareApplication" est une classe qui étend la classe d'application. Quel est le problème avec ce code?

EDIT

Ok, ajouter "Environment.getExternalStorageDirectory() getAbsolutePath();". et voici ce que je reçois dans Logcat:

08-13 16:29:34.168: ERROR/AndroidRuntime(419): FATAL EXCEPTION: pool-1-thread-5 
08-13 16:29:34.168: ERROR/AndroidRuntime(419): java.lang.IllegalArgumentException: File /mnt/sdcard/c/c/Sat Aug 13 16:29:34 GMT+00:00 2011.xml contains a path separator 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at android.app.ContextImpl.makeFilename(ContextImpl.java:1648) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at android.app.ContextImpl.openFileOutput(ContextImpl.java:414) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:158) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at com.myapp.runnable.ServerWorker.packageToXML(ServerWorker.java:197) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at com.myapp.runnable.ServerWorker.run(ServerWorker.java:85) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at java.lang.Thread.run(Thread.java:1019) 

Quand je vérifier DDMS je vois que le dossier est créé dans sdcard mais dans ce répertoire est rien si probablement le problème est survenu lorsque l'application essaie d'écrire fichier à sdcard.

I également remplacer

"FileOutputStream fOut = healthCareApplication.openFileOutput("/sdcard/b/b"+fileName+".xml",Context.MODE_WORLD_READABLE);" 

pour

File outputFile = new File(wallpaperDirectory, fileName); 
FileOutputStream fos = new FileOutputStream(outputFile); 

et obtenir une autre exception:

08-13 16:46:56.108: INFO/IOException(3110): /Sat Aug 13 16:46:56 GMT+00:00 2011 (Read-only file system) 
+4

Juste un conseil général: * jamais * hardcode le chemin de stockage comme la carte SD. Utilisez 'Environment.getExternalStorageDirectory()'. Certains appareils n'ont pas de carte SD et s'appuient sur une mémoire flash interne ou la montent entièrement ailleurs. –

+1

En outre, '/ sdcard' est tout simplement faux pour la majorité des appareils Android utilisés aujourd'hui. Utilisez 'Environment.getExternalStorageDirectory()', et assurez-vous d'avoir l'autorisation 'WRITE_EXTERNAL_STORAGE'. Si cela ne vous aide pas, utilisez 'adb logcat', DDMS ou la perspective DDMS dans Eclipse pour examiner LogCat et voir où votre accident se produit. – CommonsWare

+0

Publiez la sortie LogCat complète. –

Répondre

1

La première exception est générée, car le nom de fichier étant généré avec new Date().toString(); contient deux points (:) Ceci est illégal dans le nom de fichier.

La deuxième exception, il ressemble à wallpaperDirectory est vide que l'exception est générée parce que vous essayez d'écrire dans le répertoire/(qui est en lecture seule).

Questions connexes