特定のアクティビティで持っているビットマップを、この目的のために作成したディレクトリの外部ストレージに保存しようとしています。画像をSDカード(外部SDではなく外部メモリ)に保存する方法は別のクラス(および別のパッケージ)にあるため、コンテキストが必要になると思いましたが、コンテキストを提供する場所が見つかりません(試してみopenFileOutput
ましたがString fileName
パス区切り文字を含めることはできません) 。コードを実行すると、log cat に次のエラーが表示されます。
04-11 22:13:14.899: E/error(13833): /mnt/sdcard/myTomatoes/covers/378194.PNG: open failed: ENOENT (No such file or directory)
04-11 22:13:14.899: W/System.err(13833): java.io.FileNotFoundException: /mnt/sdcard/myTomatoes/covers/378194.PNG: open failed: ENOENT (No such file or directory)
04-11 22:13:14.899: W/System.err(13833): at libcore.io.IoBridge.open(IoBridge.java:416)
04-11 22:13:14.899: W/System.err(13833): at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
04-11 22:13:14.899: W/System.err(13833): at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
04-11 22:13:14.899: W/System.err(13833): at BL.ImageMethods.SaveImageToMemory(ImageMethods.java:60)
04-11 22:13:14.899: W/System.err(13833): at com.example.mytomatoes.MovieDetailsActivity$4.onClick(MovieDetailsActivity.java:337)
04-11 22:13:14.899: W/System.err(13833): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
04-11 22:13:14.899: W/System.err(13833): at android.os.Handler.dispatchMessage(Handler.java:99)
04-11 22:13:14.899: W/System.err(13833): at android.os.Looper.loop(Looper.java:137)
04-11 22:13:14.899: W/System.err(13833): at android.app.ActivityThread.main(ActivityThread.java:5039)
04-11 22:13:14.899: W/System.err(13833): at java.lang.reflect.Method.invokeNative(Native Method)
04-11 22:13:14.899: W/System.err(13833): at java.lang.reflect.Method.invoke(Method.java:511)
04-11 22:13:14.899: W/System.err(13833): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-11 22:13:14.899: W/System.err(13833): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-11 22:13:14.899: W/System.err(13833): at dalvik.system.NativeStart.main(Native Method)
04-11 22:13:14.899: W/System.err(13833): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
04-11 22:13:14.899: W/System.err(13833): at libcore.io.Posix.open(Native Method)
04-11 22:13:14.899: W/System.err(13833): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
04-11 22:13:14.899: W/System.err(13833): at libcore.io.IoBridge.open(IoBridge.java:400)
それらは私の許可です:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
これはファイルを保存するための私の方法です:
public static void SaveImageToMemory(Context context, Bitmap img, int rottenId) {
Log.i("SAVE IMAGE", "start save");
File sd = Environment.getExternalStorageDirectory();
File location = new File(sd.getAbsolutePath()+ "/myTomatoes/covers");
location.mkdir();
File dest = new File(location, rottenId + ".PNG");
try {
Log.i("SAVE IMAGE", "trying to save: " + dest.getPath());
FileOutputStream fos = new FileOutputStream(dest);
img.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (IOException e) {
Log.e("error", e.getMessage());
e.printStackTrace();
}
}
オブジェクトを作成するためのすべてのめちゃくちゃな行はFile
、私の試行の結果です...元のコードは次のとおりです。
File location = new File(Environment.getExternalStorageDirectory() + "/myTomatoes/covers");
File dest = new File(location, rottenId + ".PNG");
また、最初にビットマップを作成ByteArrayOutputStream
して圧縮しようとしましたが、うまくいきfos.write(mByteArrayOpStream.toByteArray())
ませんでした。
ちなみに、私はエミュレーターを使用していますが、いくつかの「Galaxy S」でこれを確認したところ、同じエラーが発生しました... (電話または DDMS でファイルを参照しようとすると、そうではないことがわかります。フォルダを作成することすらできません...