2011-08-13 17 views
0

エミュレータのSDカードにファイルを書き込む際に問題が発生しました。ここに私のコードは次のとおりです。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(); 

は、まず私は次の私はいくつかのXMLファイルを作成、SDカード上のディレクトリを作成します。次に、ファイルを作成してこのXMLファイルをこのディレクトリに保存しようとしますが、IllegalArgumentExceptionが発生し、アプリケーションがクラッシュします。 "healthCareApplication"は、アプリケーションクラスを拡張するクラスです。このコードで何が問題になっていますか? "Environment.getExternalStorageDirectory()getAbsolutePath();"

EDIT

[OK]を、私は追加しますそしてここで私は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) 

私はDDMSをチェックし、私はフォルダがSDカード内に作成されていることがわかりますがで、そのディレクトリに何がそうおそらく、アプリケーションがSDカードにファイルを書き込もうとしたときに、問題が発生しているではありません。

私も

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

ため

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

を交換し、別の例外を取得:new Date().toString();で生成されたファイル名にコロンが含まれているため

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

ちょうど一般的なアドバイス:*決してSDカードのようなストレージへのパスをハードコードしないでください。 'Environment.getExternalStorageDirectory()'を使用してください。いくつかのデバイスは、sdcardを持っておらず、内蔵のフラッシュメモリに依存しているか、まったく別の場所にマウントしています。 –

+1

さらに、 '/ sdcard'は今日使用されている大半のAndroidデバイスにとって間違っています。 'Environment.getExternalStorageDirectory()'を使い、 'WRITE_EXTERNAL_STORAGE'パーミッションを持っていることを確認してください。それでも問題が解決しない場合は、Eclipseで 'adb logcat'、DDMS、またはDDMSパースペクティブを使ってLogCatを調べ、クラッシュがどこで発生しているのかを確認してください。 – CommonsWare

+0

完全なLogCat出力をポストします。 –

答えて

1

最初の例外が生成されます( :)。これはファイル名では不正です。

/ディレクトリ(読み取り専用)に書き込もうとしているため、例外が生成されているため、wallpaperDirectoryのような2番目の例外は空白です。

関連する問題