BitmapFactory.decodeStream返回null:Android

时间:2014-03-06 02:13:41

标签: android bitmap camera

我在第二个类(Class2)中有一个方法,我从Class1传入context和uri的值。第二类(Class2)是一个类,其中滤镜将应用于使用Class1中的相机拍摄的图像。 Class2中的方法看起来像这样

public void prepareImage(Context context, Uri uri) {

    // BitmapFactory options
    Options options = new Options();
    options.inSampleSize = 2;

    String path = uri.toString();
    File file = new File(path);

        FileInputStream fis = null; //initialize
        try {
            fis = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Bitmap img = BitmapFactory.decodeStream(fis);
        Log.i(TAG, "Bitmap img: " + img);
                    //more code below, but above this comment is where the issue is

}

我注意到FileInputStream返回null,因此BitmapFactory.decodeStream没有解码。我认为有两件事是问题,但我不确定如何解决它们。首先,我想知道我是否为FileInputStream接收null,因为我使用的是由uri.toString()构成的路径。或者这有关系吗?字符串路径值是正确的。

第二个问题是,如果我的手机连接到计算机,在使用我的应用程序拍摄图像后,图像文件似乎在我从计算机上拔下设备之后才会注册。只有在我从计算机上拔下设备后,我的所有图像都会出现在图库文件夹中。所以我怀疑是没有找到文件! logcat有证据证明这一点。

Note: I blocked out the name of the app

无论如何,我不知道如何解决这场冲突。也许我需要以不同的方式保存图像。以下是我在Class1中保存图像的方法。

File imgFileDir = getDir();
            if (!imgFileDir.exists() && !imgFileDir.mkdirs()) {
                Log.e(TAG, "Directory does not exist");
            }

        //Locale.US to get local formatting
        SimpleDateFormat timeFormat = new SimpleDateFormat("hhmmss", Locale.US);
        SimpleDateFormat dateFormat = new SimpleDateFormat("ddMMyyyy", Locale.US);
        String time = timeFormat.format(new Date());
        String date = dateFormat.format(new Date());
        String photoFile = date + "_nameofapp_" + time + ".jpg";       
        String filename = imgFileDir.getPath() + File.separator + photoFile;

        File pictureFile = new File(filename);

        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(arg0);
            fos.flush();
            fos.close();
        } catch (Exception e) {
            Log.e(TAG, "Image could not be saved");
            e.printStackTrace();
        }

我也使用辅助方法

private File getDir() {
        File sdDir = Environment.
                getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        return new File(sdDir, "NameOfApp");
    }

最后,我尝试将应用程序不受限制地运行到我的计算机上以查看它是否可行,但事实并非如此。行为是一样的,我拍摄的图像没有出现在画廊中,直到我将设备重新插入我的电脑,然后我拍摄的所有图像都显示在图库中。为什么呢?

根据请求,我从Class1传递URI,执行以下操作。

Class2 classTwo = new Class2();
classTwo.prepareImage(this, uri);

1 个答案:

答案 0 :(得分:1)

只需将其移至答案,以便每个人都可以看到:

看起来你的文件Uri中有一个额外的/

file:/storage/emulated/0 ... 

/file:/storage/emulated/0 ... (from the exception message)

:)