Android Kotlin:Base64图片字符串解码为图片时遇空值异常
解决BitmapFactory.decodeByteArray返回null导致的IllegalStateException问题
嘿,这个问题我之前在项目里也踩过坑!你遇到的java.lang.IllegalStateException本质是因为BitmapFactory.decodeByteArray()返回了null——也就是说,你的字节数组没法被转换成有效的Bitmap对象。咱们从几个常见的原因入手,一步步解决:
1. 先清理Base64字符串的冗余内容
很多接口返回的Base64图片字符串会带前缀,比如data:image/png;base64,,这个前缀不属于Base64编码的核心内容,如果直接解码肯定会失败。先把这个前缀去掉:
val rawBase64 = asset?.image ?: return // 用正则移除开头的data URI前缀 val cleanBase64 = rawBase64.replaceFirst("^data:image/\\w+;base64,".toRegex(), "")
2. 检查Base64解码的参数是否匹配
不同场景下的Base64编码规则可能不一样:
- 如果是普通的Base64字符串,用
Base64.DEFAULT没问题; - 如果是URL安全的Base64(用
-和_替代了+和/),要换成Base64.URL_SAFE; - 另外如果字符串里有多余的换行符,试试
Base64.NO_WRAP参数。
3. 增加空值判断和异常捕获,避免崩溃
解码过程中可能出现各种意外(比如Base64格式错误、字节数组为空),一定要加判断和捕获:
asset?.image?.let { rawBase64 -> val cleanBase64 = rawBase64.replaceFirst("^data:image/\\w+;base64,".toRegex(), "") try { val decodedBytes = Base64.decode(cleanBase64, Base64.DEFAULT) if (decodedBytes.isNotEmpty()) { val bitmap = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size) bitmap?.let { assetImg.setImageBitmap(it) } ?: run { // Bitmap解码失败,设置错误占位图 assetImg.setImageResource(R.drawable.error_placeholder) } } else { // 解码后字节数组为空 assetImg.setImageResource(R.drawable.empty_placeholder) } } catch (e: IllegalArgumentException) { // Base64格式错误,打印日志并处理 e.printStackTrace() assetImg.setImageResource(R.drawable.error_placeholder) } } ?: run { // asset或asset.image为空的情况 assetImg.setImageResource(R.drawable.empty_placeholder) }
4. 用第三方图片库简化处理(推荐)
如果不想自己处理各种边缘情况,直接用Glide这类成熟的图片加载库,它原生支持Base64图片加载,还能自动处理格式兼容、缓存和错误情况:
asset?.image?.let { base64Str -> Glide.with(this) .load(base64Str) .placeholder(R.drawable.loading_placeholder) .error(R.drawable.error_placeholder) .into(assetImg) } ?: run { assetImg.setImageResource(R.drawable.empty_placeholder) }
内容的提问来源于stack exchange,提问作者wawanopoulos
相关产品推荐
相关产品推荐

