使用android内部存储图像

时间:2017-04-06 04:03:58

标签: android android-bitmap android-internal-storage

我正在尝试将图像文件保存到应用程序的内部存储中。

为此,我编写了以下方法,该方法获取id和位图并创建图像文件,其中directory是File类型的类静态字段。

// Returns thumbnail
private static Bitmap saveBitmapWithThumbnail(long id, Bitmap bitmap) {
    Bitmap thumbnail;

    if(directory == null) {
        ContextWrapper cw = new ContextWrapper(Engine.getContext());
        directory = cw.getDir(DIRECTORY_NAME, Context.MODE_PRIVATE);
        if(!directory.exists()) directory.mkdir();
    }

    saveBitmap(getImageFileName(id), bitmap);
    saveBitmap(getThumbnailFileName(id), thumbnail=makeThumbnail(bitmap));
    return thumbnail;
}

这种方法的作用是获取一个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个数据。

  3. 我这样做是因为我没有在我的应用程序中编写任何文件或阅读文件。

    我唯一的猜测是当我再次编译项目时,它以某种方式改变了我的应用程序上下文中的一些独特内容,这导致内部存储空间发生变化,我认为这是非常废话。

    我错在哪里?

2 个答案:

答案 0 :(得分:0)

你必须给予marshmallow及以上的runtime许可:

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

答案 1 :(得分:0)

有些事情你可能做错了。每当您想要读/写内部/外部存储时,您必须确保执行以下操作;

  1. ALTER COLUMN存储权限放入您的清单中。
  2. 如果您的READ/WRITEAndroid Version或更高,请询问运行时权限。您可以获得有关此here
  3. 的信息
  4. 确保Marshmallow正确无误。大多数情况下,硬编码路径会有所不同。有关详细信息,请参阅here
  5. 如果path不存在,请务必致电mkdirs()
  6. 确保directory正确无误。您之前说过它是filename11.png,但后来您访问了11_tn.png。可能是这导致了问题。