如何用setImageURI从数据库加载图片到Android ImageView及页面传参显示
关于网络图片加载的问题
你遇到的问题其实是因为setImageURI()这个方法的设计初衷并不是用来加载网络图片的——它只支持本地文件Uri或者Content Provider提供的Uri,没有处理网络请求、图片解码缓存这些能力,所以直接传网络URL肯定没效果。
既然你之前已经在用Glide了,其实继续用Glide来加载这个详情页的图片是最稳妥的,代码也简单,完全不用折腾系统方法:
Glide.with(this) .load(image) // 直接传你从Intent拿到的URL字符串就行 .into(displayImage);
要是你实在不想用第三方库,那得自己写异步网络请求下载图片,转成Bitmap后用setImageBitmap()设置,但这样要处理很多细节(比如网络异常、内存缓存、图片压缩),远不如Glide省心。
用setImageURI从数据库加载图片的两种场景
这个得看你数据库里存的是图片的什么数据,分两种情况:
场景1:数据库存的是本地图片文件路径
如果数据库里存的是图片在本地存储的绝对路径(比如/sdcard/Pictures/xxx.png),可以把路径转成Uri后用setImageURI():
// 从数据库获取图片路径 String localImagePath = "从数据库查询到的路径"; File imageFile = new File(localImagePath); if (imageFile.exists()) { // 注意Android 7.0+要用FileProvider生成安全Uri,避免FileUriExposedException Uri imageUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", imageFile); displayImage.setImageURI(imageUri); }
关于FileProvider的配置,你需要:
- 在
AndroidManifest.xml里注册FileProvider组件,指定authorities和文件路径 - 在
res/xml下创建file_paths.xml,定义允许共享的本地目录
场景2:数据库存的是图片的Blob二进制数据
这种情况setImageURI()没法直接用,因为Blob不是Uri格式。你有两种选择:
- 把Blob转成Bitmap,用
setImageBitmap()设置:
Blob blob = 从数据库查询到的Blob对象; byte[] imageBytes = blob.getBytes(1, (int) blob.length()); // 注意索引从1开始 Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); displayImage.setImageBitmap(bitmap);
- 把Blob写入临时文件,再用
setImageURI()加载:
Blob blob = 从数据库查询到的Blob对象; byte[] imageBytes = blob.getBytes(1, (int) blob.length()); // 创建缓存目录下的临时文件 File tempImage = new File(getCacheDir(), "temp_db_image.jpg"); try (FileOutputStream fos = new FileOutputStream(tempImage)) { fos.write(imageBytes); } catch (IOException e) { e.printStackTrace(); } // 用FileProvider生成Uri加载 Uri tempUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", tempImage); displayImage.setImageURI(tempUri);
内容的提问来源于stack exchange,提问作者Proversion
相关产品推荐
相关产品推荐

