Android从图片目录在画布上绘制位图

时间:2016-05-15 23:00:03

标签: android canvas bitmap storage

使用以下代码将jpg加载到位图并在画布上绘制

File extStore = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        File myFile = new File(extStore.getAbsolutePath() + "/MyPicture.jpg");

        if(myFile.exists()){
            Toast.makeText(getBaseContext(),"yes",Toast.LENGTH_LONG).show();
        }


        Bitmap b1 = BitmapFactory.decodeFile(myFile.toString());
        canvas.drawBitmap (b1, 0,  0, null);

该应用程序因2个错误而崩溃

BitmapFactory:无法解码流:java.io.FileNotFoundException:/storage/emulated/0/Pictures/MyPicture.jpg:open failed:EACCES(Permission denied)

进一步向下说

java.lang.NullPointerException:尝试在空对象引用上调用虚方法'boolean android.graphics.Bitmap.isRecycled()'

我在manaifest中设置权限如下

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

应用程序的目标是API 19,因此无关紧要

检查文件是否存在,以确保它是正确的位置

它不会在我出错的地方运用任何想法

提前致谢

标记

1 个答案:

答案 0 :(得分:0)

您找到了找不到文件的异常,因为找不到该文件。 /storage/emulated/0/Pictures/MyPicture.jpg

中没有图像文件

如果你这样做,你应该做一个非常基本的警告对话框并让它能够选择文件。

Choose File Dialog

它实际上有一个非常好的设置,非常容易使用,但是你可以实际导航一下,找到你正确的文件。然后加载它并让它实际存在。

回收是因为它实际上没有加载图像,所以它回收了它。如果图像被回收,你可以在加载失败后检查我认为该命令是isRecycled()然后退出。

如果你自己抛出错误,你可能会感觉更好。如果toString()是偶然的,而不是设计,甚至可能是你的整个bug,而不是正确地应该是getCanonicalPath()的file.toString()。

但是你可以自己打开文件并将BitmapFactory传递给输入流,这可能会更早地抛出错误,即当你试图打开不存在的文件时。

这里是它用于decodeFile()位的内部源。

386    public static Bitmap More ...decodeFile(String pathName, Options opts) {
387        Bitmap bm = null;
388        InputStream stream = null;
389        try {
390            stream = new FileInputStream(pathName);
391            bm = decodeStream(stream, null, opts);
392        } catch (Exception e) {
393            /*  do nothing.
394                If the exception happened on open, bm will be null.
395            */
396            Log.e("BitmapFactory", "Unable to decode stream: " + e);
397        } finally {
398            if (stream != null) {
399                try {
400                    stream.close();
401                } catch (IOException e) {
402                    // do nothing here
403                }
404            }
405        }
406        return bm;
407    }

理论上,如果你查看logcat,你可能会看到它发出的Log.e(),但它没有抛出错误,它会在内部捕获它。尝试自己打开文件。这样你就可以更好地调试它搞乱的地方以及它抛出的特定IO错误。