You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么BitmapFactory.decodeByteArray处理扫描仪base64图片时返回null

Android端解析扫描仪返回Base64图片失败解决方案
  • 首先排查Base64字符串前缀问题:扫描仪返回的Base64大概率带了Data URI协议前缀,格式为data:image/[格式];base64,,Python的Base64处理库会自动过滤这类前缀,而Android原生Base64.decode方法不会,直接传入带前缀的字符串会解码出错误的字节数组,导致Bitmap生成失败。
    修复代码:先截断前缀再解码
    String img1_64 = datacam1.getString("image");
    // 过滤Data URI前缀
    if (img1_64.startsWith("data:image")) {
        img1_64 = img1_64.substring(img1_64.indexOf(",") + 1);
    }
    
  • 其次调整Base64解码标志位:你当前使用的Base64.DEFAULT要求Base64字符串每76字符带换行符,而绝大多数扫描仪返回的是连续无换行的Base64串,部分设备还会使用URL安全编码(将+替换为-、/替换为_、省略末尾=填充符),和DEFAULT规则不匹配导致解码错误。
    优先尝试用Base64.NO_WRAP解码,适配无换行的普通Base64:
    byte[] decodedString1 = Base64.decode(img1_64, Base64.NO_WRAP);
    
    如果上述解码失败,替换为URL安全模式:
    byte[] decodedString1 = Base64.decode(img1_64, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP);
    
  • 增加异常排查逻辑:解码后先判断Bitmap是否为空,打印日志定位问题阶段,避免空引用异常:
    Bitmap img1 = BitmapFactory.decodeByteArray(decodedString1, 0, decodedString1.length);
    if (img1 != null) {
        imageview1.setImageBitmap(img1);
    } else {
        Log.e("IMG_DECODE", "生成Bitmap失败,解码后字节数组长度:" + decodedString1.length);
        // 可额外打印字节数组前4位,校验是否符合图片文件头:JPEG为FF D8 FF E0、PNG为89 50 4E 47
    }
    
  • 额外校验:将Android端拿到的img1_64字符串和Python端拿到的Base64字符串做对比,确认JSON解析过程没有引入多余转义字符、空格或者截断问题。

你之前用网上工具生成的Base64测试正常,是因为这类工具生成的Base64格式和Base64.DEFAULT规则匹配,而扫描仪返回的Base64编码规则不同,才会出现适配问题。

内容的提问来源于stack exchange,提问作者Shayan Khajehnouri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:45:07