Android开发:从URL获取图片并显示,如何避免保存至存储?
搞定图片只显示不进相册的问题
兄弟,你的问题核心出在Images.Media.insertImage()这个方法上——它本来就是用来把图片插入到系统媒体库(也就是相册)的,所以不管你后续怎么加载,图片都会出现在相册里。下面给你几个可行的解决方案,按需选就行:
方案一:直接用Glide加载URL,一步到位(最推荐)
其实Glide默认就不会把图片存到相册里!它会把图片缓存到应用的私有缓存目录,这个目录的内容不会被系统媒体扫描器识别,自然不会出现在相册里。你完全不需要先转成Bitmap再存Uri,直接加载URL到ImageView就好:
Glide.with(context) .load("你的图片服务器URL") .into(yourImageView);
这个方法最简单,还省了中间转Bitmap的步骤,效率也更高。
方案二:如果必须先拿Bitmap,别存媒体库
要是业务上必须先获取Bitmap再处理,那千万不要用Images.Media.insertImage(),换两种方式:
- 内存直接显示:拿到Bitmap后,直接用
ImageView.setImageBitmap(yourBitmap)显示,完全不写入磁盘,肯定不会进相册; - 存到应用私有目录:把Bitmap保存到应用的私有文件夹(比如
context.getCacheDir()或者context.getFilesDir()),这个目录只有你的应用能访问,系统不会扫描这里的内容。
示例代码(存私有目录后用Glide加载):
// 把Bitmap保存到应用私有缓存目录 private File saveBitmapToPrivateCache(Context context, Bitmap bitmap) throws IOException { File cacheDir = context.getCacheDir(); // 创建临时文件,后缀可以是.jpg或.png File tempImage = File.createTempFile("temp_img", ".jpg", cacheDir); FileOutputStream fos = new FileOutputStream(tempImage); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); return tempImage; } // 加载这个私有文件到ImageView File privateImageFile = saveBitmapToPrivateCache(context, yourBitmap); Glide.with(context) .load(privateImageFile) .into(yourImageView);
方案三:存公共目录但用.nomedia隐藏
如果因为某些原因必须把图片放到公共存储目录,又不想让它出现在相册,那就在存放图片的文件夹里创建一个名为.nomedia的空文件——系统媒体扫描器看到这个文件,就会跳过整个文件夹的内容,不会把里面的图片加到相册里。
示例代码:
// 创建带.nomedia的文件夹 private File createNoMediaFolder(Context context) { // 用外部存储的应用私有目录,Android 10+不需要存储权限 File externalFilesDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES); File hiddenFolder = new File(externalFilesDir, "my_hidden_images"); if (!hiddenFolder.exists()) { hiddenFolder.mkdirs(); } // 创建.nomedia空文件 File noMediaFile = new File(hiddenFolder, ".nomedia"); if (!noMediaFile.exists()) { try { noMediaFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } return hiddenFolder; } // 保存Bitmap到这个隐藏文件夹 private File saveBitmapToNoMediaFolder(Context context, Bitmap bitmap) throws IOException { File hiddenFolder = createNoMediaFolder(context); File imageFile = new File(hiddenFolder, "img_" + System.currentTimeMillis() + ".jpg"); FileOutputStream fos = new FileOutputStream(imageFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); return imageFile; } // 加载图片 File hiddenImage = saveBitmapToNoMediaFolder(context, yourBitmap); Glide.with(context) .load(hiddenImage) .into(yourImageView);
总的来说,优先选方案一,简单高效;如果必须处理Bitmap,就用方案二;万不得已要存公共目录,再用方案三。
内容的提问来源于stack exchange,提问作者Marinescu Raluca
相关产品推荐
相关产品推荐

