【问题标题】:Decoding File to Bitmap sometimes works and sometimes does not将文件解码为位图有时有效,有时无效
【发布时间】:2016-01-31 11:38:04
【问题描述】:

我正在使用EasyImage图书馆拍照。
然后我将这些文件转换为位图,然后将位图转换为 Base64 并将其上传到服务器。
我知道,这不是一个好方法,但我目前就是这样做的。

拍照时:

@Override
public void onImagePicked(File imageFile, EasyImage.ImageSource source) {
    uploadImage(imageFile);
}

这是“uploadImage”方法中的第一行:

Image image = new Image(LoginManager.getInstance(getApplicationContext()).getUsername(), file);

这是构造函数:

public Image(String userName, File imageFile) {
    this.userName = userName;
    this.imageFile = imageFile;

    createBase64(getBitmap());
}

在“getBitmap”内部是问题开始的地方。尤其是这两行:

bitmap = BitmapFactory.decodeFile(imageFile.getPath());
bitmap = Bitmap.createScaledBitmap(bitmap, 100, 100, false);

imageFile 从不为空。
我用调试器检查了至少 100 次,它永远不会为空。它也总是有路径。
getPath() 永远不会为空。
但是,它仍然经常无法创建位图。

有时它成功并且一切正常,但大多数时候,位图为空。
我不知道为什么。
文件(拍摄的照片)总是创建成功并且永远不会为空,但由于某种原因它无法创建位图。

【问题讨论】:

    标签: android bitmap android-file


    【解决方案1】:

    来自documentation

    退货
    生成的解码位图,如果无法解码,则返回 null。

    这可能有多种原因,大多数时候位图太大而无法分配空间。

    检查图像的路径是否存在,并且您对指定的 URI 具有读/写权限。

    如果您有访问权限但仍然失败,您应该在方法调用中添加BitmapFactory.Options 并设置inSampleSize 以加载较小版本的图像。

    如果设置为大于 1 的值,则请求解码器对原始图像进行二次采样,返回较小的图像以节省内存。

    此外,在使用位图时,您应该始终检查返回的null,因为内存总是一个问题。

    【讨论】:

    • 感谢您的回答。我已将 inSampleSize 设置为 4(也尝试了 8),但遗憾的是它仍然无法正常工作。同样的问题。您还有其他想法可能出了什么问题吗?
    • @Whiz 在通话之前/之后检查您的 LogCat 是否有可能的输出。确保 uri / 路径存在并且您具有读/写访问权限,除此之外......很难说
    • 当你提到“读/写权限”时,我去查看我的应用信息(在手机上),发现我只授予了 CAMERA 权限,但没有授予 STORAGE 权限。我授予了存储权限,回到应用程序,现在它 100% 的时间都在工作。为什么会发生这种情况?当您尝试未经许可做某事时,应用程序不应该崩溃吗?为什么它有时(很少)实际上仍然有效?我对此感到非常困惑。但无论如何,非常感谢!随意在您的答案中添加许可内容,我很乐意接受它:)
    • @Whiz 奇怪的是它有时会起作用.. 但很可能是位图工厂处理“无访问”异常并且只返回 null,就像指定的那样。我更新了答案,谢谢
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2012-08-02
    • 2015-03-31
    • 1970-01-01
    相关资源
    最近更新 更多