2017-04-06 6 views
0

イメージファイルをアプリケーションの内部ストレージに保存しようとしています。イメージのためのアンドロイド内部ストレージの使用

これを行うには、idとビットマップをとり、imageのファイルを作成する次のメソッドを書きました。ここで、directoryはFile型のクラス静的フィールドです。

この方法は、IDとビットマップを取得し、元のファイルと作成したサムネイルを内部ストレージに保存することです。

名前は、元のファイルの[id + "。png"]とサムネイルファイルの[id + "_ tn.png"]として生成されます。

saveBitmap()mehtodは、ビットマップを内部ストレージに書き込むものです。

private static void saveBitmap(String fileName, Bitmap bitmap) { 
    File imageFile = new File(directory, fileName); 

    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(imageFile); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); 
     fos.close(); 
    } catch(Exception e) {} 
} 

これは、ファイル名(11.png、11_tn.png、...)とビットマップをとる(それが元またはサムネイルのかどうか)と、ファイルを作成し、それの出力ストリームに圧縮。

奇妙なことは、初めて画像を保存するためにアプリケーションを実行すると素晴らしいことです。

内部ストレージに保存されている画像を読み書きすることができます。

ただし、アプリケーションを閉じてもう一度実行すると、次のログでFileNotFoundExceptionがスローされます。私が作ることができ

W/System.err: java.io.FileNotFoundException: /1.png: open failed: ENOENT (No such file or directory) 
W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:458) 
W/System.err:  at java.io.FileInputStream.<init>(FileInputStream.java:78) 
W/System.err:  at com.google.dotplace.dotplace.data.Image.parseCursor(Image.java:118) 
W/System.err:  at com.google.dotplace.dotplace.data.Image.checkDebug(Image.java:74) 
W/System.err:  at com.google.dotplace.dotplace.LoadActivity.debugDatabase(LoadActivity.java:77) 
W/System.err:  at com.google.dotplace.dotplace.LoadActivity.onCreate(LoadActivity.java:25) 
W/System.err:  at android.app.Activity.performCreate(Activity.java:5275) 
W/System.err:  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
W/System.err:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2167) 
W/System.err:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2253) 
W/System.err:  at android.app.ActivityThread.access$800(ActivityThread.java:142) 
W/System.err:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
W/System.err:  at android.os.Looper.loop(Looper.java:136) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5120) 
W/System.err:  at java.lang.reflect.Method.invokeNative(Native Method) 
W/System.err:  at java.lang.reflect.Method.invoke(Method.java:515) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
W/System.err:  at dalvik.system.NativeStart.main(Native Method) 
W/System.err: Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory) 
W/System.err:  at libcore.io.Posix.open(Native Method) 
W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 
W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:442) 
W/System.err: ... 19 more 

のみ結論は、内部ストレージの変更であるか、それは私のアプリケーションを閉じた後のファイルが削除されているが、私はなぜ知らないのです。

今私が推測しているのは、テストに問題があるということです。

私はこれを次のようにテストしています。

  1. ファイルを挿入してプロジェクトをコンパイルして実行します。

  2. ファイルを挿入せずにプロジェクトをコンパイルして実行し、1のデータが残っているかどうかを確認します。

私はアプリケーションでファイルを書き込んだり読み込んだりしていません。

私が推測するのは、プロジェクトをもう一度コンパイルするときに、アプリケーションのコンテキスト内で何らかの形でユニークなものが変わってしまい、内部ストレージが変更されてしまい、それがかなりナンセンスだと思います。

どこが間違っていますか?あなたはマシュマロのためにと、上記runtime許可を与える必要があり

答えて

0

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />` 
+0

返信いただきありがとうございますが、私は許可を必要としない内蔵ストレージを使用しています。 –

0

あなたは間違っていることもいくつかあります。内部/外部ストレージを読み書きする場合は、必ず次のことを行う必要があります。

  1. READ/WRITEマニフェストにストレージ権限を設定します。
  2. Android VersionMarshmallow以上の場合は、実行時のアクセス許可を確認してください。この情報を入手できますhere
  3. pathが正しいことを確認してください。ほとんどの場合、ハードコーディングされたパスによって違いが生じます。詳細はhereを参照してください。
  4. directoryが存在しない場合はmkdirs()に電話してください。
  5. filenameが正しいことを確認してください。あなたは以前にそれが11.png11_tn.pngだと言ったが、後で1.pngにアクセスした。これが問題の原因になっている可能性があります。
+0

返信いただきありがとうございますが、私は内部ストレージを使用しており、許可を必要としません。私はパスをハードコーディングするのではなく、ContextWrapperから取得します。 saveBitmapWithThumbnail()メソッドのif文の中にフォルダが存在するかどうかを確認します。 11.pngと11_tn.pngは単なる例であり、私はsqlliteのidから1から始まるファイル名を使用します。それが私のアプリケーションが1.pngと1_tn.pngにアクセスしようとした理由です。彼らは最初にデータベースに入れ、IDは1に設定されていました。 –

+0

あなたの 'error'は明らかにファイルが見つからないと言っているので、ストレージに何か問題があるはずです。見て[ここ](http://stackoverflow.com/questions/26579869/how-can-i-let-users-access-the-internal-storage-directory-of-my-app) –

+0

うん...だからこそ私は混乱している。私はこの問題を調査したときにその疑問を見つけたが、ContextWrapperとFileが提供する内部パスのみを使用している間、内部と外部のストレージパスを混同していた。また、私のコードは最初に実行されたときに動作するので、はるかに奇妙です。それは画像を書き込み、読み取ることができます。私のアプリケーションを閉じて、それを実行するとエラーが発生します..何が起こっているのか分かりません。 :( –

関連する問題