Base64格式预设图片无法显示:ImageView加载SharedPreferences默认值异常
解决Base64预设图片无法在ImageView显示的问题
嘿,我之前也踩过Base64图片加载的坑,咱们一步步来排查你遇到的问题:
最可能的核心问题:默认值获取错误
你代码里写的String.valueOf(R.string.standard_profile_picture)是把字符串资源的ID(int类型)转成了字符串,而不是获取到你存在strings.xml里的Base64内容!比如R.string.standard_profile_picture的实际值是一串数字(比如2131230721),用String.valueOf转后就是这个数字字符串,根本不是有效的Base64,解码肯定失败。
修正方法:用getResources().getString(R.string.standard_profile_picture)来获取实际的Base64字符串:
SharedPreferences sharedPreferences = ...; // 你的SharedPreferences实例 String base64Pic = sharedPreferences.getString( getString(R.string.user_picture_key), getResources().getString(R.string.standard_profile_picture) ); pic.setImageBitmap(decodeToBitmapAndGet(base64Pic));
第二个可能:Base64字符串带前缀需要处理
很多在线转换工具会给Base64字符串加上前缀(比如data:image/png;base64,),而BitmapFactory无法识别这个前缀,必须先去掉:
private Bitmap decodeToBitmapAndGet(String base64Str) { // 检查并移除前缀 if (base64Str.startsWith("data:image/")) { base64Str = base64Str.split(",")[1]; } try { byte[] decodedBytes = Base64.decode(base64Str, Base64.DEFAULT); return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length); } catch (IllegalArgumentException e) { e.printStackTrace(); // 解码失败时返回一个默认Drawable转Bitmap(可选兜底) Drawable defaultDrawable = getResources().getDrawable(R.drawable.default_profile); return drawableToBitmap(defaultDrawable); } } // 可选:Drawable转Bitmap的工具方法 private Bitmap drawableToBitmap(Drawable drawable) { if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; }
第三个可能:Base64字符串本身无效
可以把你存在strings.xml里的Base64字符串复制出来,用本地HTML页面(比如写个<img src="data:image/png;base64,你的字符串">)验证一下,确认它能正常显示图片。如果解析失败,说明你转换的时候出了问题,重新转换一次即可(注意不要包含多余的空格或换行)。
按这几步排查,应该就能解决你的预设图片显示问题啦!
内容的提问来源于stack exchange,提问作者Samuel M.
相关产品推荐
相关产品推荐

