为什么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:
如果上述解码失败,替换为URL安全模式:byte[] decodedString1 = Base64.decode(img1_64, Base64.NO_WRAP);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
相关产品推荐
相关产品推荐

