Android加载相机图像为位图

时间:2010-06-01 04:20:37

标签: java android bitmap

我正在使用BitmapFactory.decodeFile将图像的位图加载到我的应用程序中。但是,该函数在大图像(例如来自摄像头的图像)上返回null。文件路径肯定是正确的,我只是无法弄清楚它为什么会返回null。我尝试过超级采样,但似乎没有帮助。

有没有人知道它为什么会这样做,或者我如何更轻松地将从相机拍摄的图像加载到位图中?

这是我正在使用的代码:

public static Bitmap loadBitmap(String filePath){
    Bitmap result = BitmapFactory.decodeFile(filePath);

    if(result == null){
        if(filePath.contains(".jpg") || filePath.contains(".png")){
            //This is the error that occurs when I attempt to load an image from the Camera DCIM folder or a large png I imported from my computer.
            Utils.Toast("Could not load file -- too big?"); 
        } else {
            Utils.Toast("Could not load file -- image file type is not supported");
        }
    }
    return result;
}

3 个答案:

答案 0 :(得分:3)

您需要提供有关您的问题的更多信息,例如您正在使用的代码段。如果您想知道BitmapFactory.decodeFile方法何时/为何返回null,您可以直接阅读其源代码:http://casidiablo.in/BitmapFactory

例如,导致BitmapFactory.decodeFile返回null的原因之一是在打开文件时出现问题。奇怪的是,开发人员不能用这样的问题记录任何东西......看看评论“什么也不做。如果异常发生在打开,bm将为空。”

public static Bitmap decodeFile(String pathName, Options opts) {
    Bitmap bm = null;
    InputStream stream = null;
    try {
        stream = new FileInputStream(pathName);
        bm = decodeStream(stream, null, opts);
    } catch (Exception e) {
        /*  do nothing.
            If the exception happened on open, bm will be null.
        */
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                // do nothing here
            }
        }
    }
    return bm;
}

正如您所看到的,BitmapFactory.decodeFile不能独立运行......但它使用BitmapFactory类的其他一些方法(例如,BitmapFactory.decodeStreamBitmapFactory.nativeDecodeStreamBitmapFactory.finishDecode等)。问题可能在于其中一种方法,所以如果我是你,我会尝试阅读并理解它们是如何工作的,以便我知道在哪些情况下它们会返回null。

答案 1 :(得分:0)

答案 2 :(得分:0)

听起来很明显,但请检查您的filePath实际上是否指向某个文件。您提到您正在使用文件管理器来选择要打开的图像 - 文件管理器可能正在返回内容提供程序而不是文件的路径。

有一种更健壮的方法可以使用ContentResolver类打开文件,该类可以打开内容提供者,文件或资源的InputStream,而无需事先知道传递的路径类型。

唯一的问题是你需要在调用openInputStream()而不是String时调用Uri对象。

public static Bitmap loadBitmap(String filePath, Context c) {
    InputStream inStream;

    try {
        inStream = c.getContentResolver().openInputStream( Uri.parse(filePath) );
    } catch (FileNotFoundException e) {
        // handle file not found
    }

    return BitmapFactory.decodeStream(inStream);
}

这也恰好是ImageView小部件在使用setImageURI方法时尝试加载图像的方式。