Android中将API返回的Base64字符串显示到ImageView问题求助
解决Base64图片加载到ImageView触发异常的问题
我一眼就看出问题出在哪了——你拿到的Base64字符串带了前缀标识,直接解码肯定会失败!
你从API获取的字符串是这种格式:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUg.....KUfsaX4AAAAASUVORK5CYII=",其中data:image/png;base64,是MIME类型标识,并不是Base64编码的图片数据本身。Base64.decode()方法只能处理纯Base64编码的内容,带这个前缀会导致解码失败,直接跳进catch块。
修正步骤:
- 先把前缀部分从字符串中移除,只保留逗号后面的纯Base64数据
- 再执行解码和Bitmap转换操作
- 额外加一步Bitmap空值判断,避免后续空指针问题
修正后的完整代码:
@BindView(R.id.zeichnung) ImageView drawable1; try { String result = response.body().string(); // 移除Base64字符串的前缀标识 if (result.startsWith("data:image/")) { // 找到逗号的位置,截取后面的纯Base64内容 int commaIndex = result.indexOf(","); if (commaIndex != -1) { result = result.substring(commaIndex + 1); } } // 解码纯Base64数据 byte[] decodedString = Base64.decode(result, Base64.DEFAULT); Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); // 判断Bitmap是否成功生成,再设置到ImageView if (decodedByte != null) { drawable1.setImageBitmap(decodedByte); } else { Toasty.error(VideoChatActivity.this, "图片解码失败.", Toast.LENGTH_SHORT, true).show(); } } catch (Exception e) { // 打印异常信息方便排查(上线前可移除) e.printStackTrace(); Toasty.error(VideoChatActivity.this, "加载图片出错: " + e.getMessage(), Toast.LENGTH_SHORT, true).show(); }
额外提示:
如果API可能返回不同格式的图片(比如jpg、webp),前缀会变成data:image/jpeg;base64,之类的,上面的代码通过找逗号位置截取的方式,能兼容所有这类带MIME前缀的Base64图片字符串,比硬写png前缀更通用。
内容的提问来源于stack exchange,提问作者Jaan
相关产品推荐
相关产品推荐

