九、Intent传递图片


今天碰到一个需求:A界面点击用户头像logo, 能够在B界面放大预览。B界面预览图片使用的是Glide。有多种办法,记录如下:

1. 傻瓜办法(不推荐):获取用户头像控件(一般是ImageView)的Bitmap, 传递到B界面再用Glide展示

1
2
3
4
5
6
7
8
9
10
11
12
imageView.buildDrawingCache();
Bitmap image= imageView.getDrawingCache();

Bundle extras = new Bundle();
extras.putParcelable("imagebitmap", image);
intent.putExtras(extras);
startActivity(intent);

B界面展示:
Bundle extras = getIntent().getExtras();
Bitmap bmp = (Bitmap) extras.getParcelable("imagebitmap");
Glide.with(context).load(bmp)

办法1不推荐原因是Intent传递Bitmap很容易造成OOM。据说Bitmap不能大于40K,我没有验证过。

2. 推荐方案:我们知道显示的图片要么是来自于网络要么是来自本地。网络图片我们用intent传递url过去,本地图片传递文件名。不管是哪种,都传递的是字符串。现在看下接收端怎么处理

1
2
3
4
5
6
7
8
9
10
11
12
13
1.本地图片:假设url为 showLocalPic:ic_logo_64

if (mImgUrl.startsWith("showLocalPic:")) {
mImgUrl = mImgUrl.replaceFirst("showLocalPic:", "");
int imgResId = getResources().getIdentifier(mImgUrl, "drawable", getPackageName());
Glide.with(context).load(imgResId)
}

2. 网络图片
如果是纯url的,直接加载即可 Glide.with(context).load(mImgUrl)
如果是Base64,也就是url存储的是个图片:
byte[] decodedByteArray = Base64.decode(mImgUrl, Base64.DEFAULT );
Glide.with(this).load(decodedByteArray);

注意:使用文件名获取对应资源ID办法: int imgResId = getResources().getIdentifier(mImgUrl, “drawable”, getPackageName());
这里的 drawable 还可以是 xml, layout等等