Java Android将相机图像加载为位图

Java Android将相机图像加载为位图,java,android,bitmap,Java,Android,Bitmap,我正在使用BitmapFactory.decodeFile将图像的位图加载到我的应用程序中。但是,该函数在大图像(例如来自摄影机的图像)上返回null。文件路径是绝对正确的,我只是不明白为什么它会返回null。我尝试了超级取样,但似乎没有用 有没有人知道为什么会这样做,或者我如何更容易地将从相机拍摄的图像加载到位图中 以下是我正在使用的代码: public static Bitmap loadBitmap(String filePath){ Bitmap result = BitmapF

我正在使用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;
}

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

例如,导致
BitmapFactory.decodeFile
返回null的原因之一是打开文件时是否出现问题。奇怪的是,开发人员没有记录任何与此相关的问题。。。查看注释“什么也不做。如果异常发生在open上,bm将为null。”


如您所见,
BitmapFactory.decodeFile
无法独立工作。。。但是它使用了
BitmapFactory
类的一些其他方法(例如,
BitmapFactory.decodeStream
BitmapFactory.NativeDecodeseam
BitmapFactory.finishDecode
,等等)。问题可能出在其中一个方法上,所以如果我是你,我会尝试阅读并理解它们是如何工作的,这样我就可以知道在哪些情况下它们返回null。

也许inSampleSize选项可以帮助你?

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

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

唯一需要注意的是,您需要在调用openInputStream()时传递一个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方法时尝试加载图像的方式。

是否将相机图像保存在SD卡上?是否存在路径中的所有目录?是的,通过文件浏览器选择图像,以确保路径正确。在同一个文件夹中选择的其他(较小的)图像可以很好地工作。您能提供一些您正在使用的代码吗?添加了我使用的代码。路径是正确的(我使用一个文件管理器来选择它),只是出于某种原因它返回null。我刚刚发布了代码(可能是在您键入回复时)。我会像你建议的那样研究其中的一些方法。谢谢好吧,我只是尝试了FileInputStream方法,实际上它说文件不存在。考虑到那里有一个文件,这很奇怪。我会继续摆弄的。好吧,看来文件名是个问题。当我将图像重命名为“image.jpg”而不是基于照片时间戳的名称时,我实际上可以加载这些图像。谢谢你的帮助。当然,我现在有一个OOM异常,但这是另外一个需要处理的问题。你知道我在哪里可以找到Gallery应用程序的源代码吗(或者任何相关的源代码)。我只需要弄清楚他们在加载和显示大型图像时如何解决堆大小小的问题。我没有遇到内存不足的错误,而且超级采样在我尝试时似乎没有任何帮助。
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);
}