Android 图片保存到相册不显示的解决方案(兼容Android 10及更高版本)
前言
写了一个demo,简单逻辑就是:在一个图片上添加一行文字或者是水印,并且保存到系统相册,也就是我们手机上的图库。前面编辑图片添加水印都没有问题,到后面保存到系统相册出现了问题:显示不出来图片。
问题
在 Android 10 之前保存系统相册的三步骤:
- 保存图片到手机
- 把图片插入到手机图库
- 发广播更新
代码如下:
public static void savePhotoAlbum(Context context, Bitmap bmp) { // 首先保存图片 File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee"); if (!appDir.exists()) { appDir.mkdir(); } String fileName = System.currentTimeMillis() + ".jpg"; File file = new File(appDir, fileName); try { FileOutputStream fos = new FileOutputStream(file); bmp.compress(CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 其次把文件插入到系统图库 try { MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null); } catch (FileNotFoundException e) { e.printStackTrace(); } // 最后通知图库更新 context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path))); }
出现的问题:图片不显示,也就是说没有更新到系统图库中。
细心的小伙伴会发现,上段代码有两处地方废弃的方法:
MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null);
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));
解决问题
下面是解决上面的问题,并兼容 Android10 版本:
/** * 添加水印并保存到系统相册 */ private void imgMerge() { new Thread(() -> { try { Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test); File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "newFile.jpg"); if (!file.exists()) { file.createNewFile(); } //添加水印文字位置。 Bitmap newBitmap = addTextWatermark(bitmap, "测试demo示例"); //保存到系统相册 savePhotoAlbum(newBitmap, file); } catch (Exception e) { e.printStackTrace(); } }).start(); } /** * 保存到相册 * * @param src 源图片 * @param file 要保存到的文件 */ private void savePhotoAlbum(Bitmap src, File file) { if (isEmptyBitmap(src)) { return; } //先保存到文件 OutputStream outputStream; try { outputStream = new BufferedOutputStream(new FileOutputStream(file)); src.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); if (!src.isRecycled()) { src.recycle(); } } catch (FileNotFoundException e) { e.printStackTrace(); } //再更新图库 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DISPLAY_NAME, file.getName()); values.put(MediaStore.MediaColumns.MIME_TYPE, getMimeType(file)); values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM); ContentResolver contentResolver = getContentResolver(); Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); if (uri == null) { return; } try { outputStream = contentResolver.openOutputStream(uri); FileInputStream fileInputStream = new FileInputStream(file); FileUtils.copy(fileInputStream, outputStream); fileInputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } else { MediaScannerConnection.scanFile( getApplicationContext(), new String[]{file.getAbsolutePath()}, new String[]{"image/jpeg"}, (path, uri) -> { // Scan Completed }); } }
发送广播和插入MediaProvider两种方式添加图片到相册,这两种方式已经官方废弃了。在 Android 10版本以及更高版本使用上面的方法,才能有效解决不显示图片的问题。
做个记录!
以上就是Android 图片保存到系统相册不显示的解决方案(兼容Android 10及更高版本)的详细内容,更多关于Android 图片保存到相册不显示的资料请关注脚本之家其它相关文章!
- Android 版本、权限适配相关总结
- Android Studio 2020新版本卡在Gradle downloading/sync failed/下载缓慢/下载超时的问题
- 详解如何在Android studio中更新sdk版本和build-tools版本
- Android Studio下载、安装和配置+SDK+tools下载(无敌超级详细版本)
- Android Studio3.6.3 当前最新版本数据库查找与导出方法(图文详解)
- 详解Android studio 3+版本apk安装失败问题
- android studio 打包自动生成版本号与日期,apk输入路径详解
- Android开发获取手机Mac地址适配所有Android版本
- Android实现悬浮窗全系统版本
- 详解Android版本适配:9.0 Pie
- Android ProductFlavor的使用详解
相关文章
Android使用TextView,设置onClick属性无效的解决方法
下面小编就为大家带来一篇Android使用TextView,设置onClick属性无效的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2016-12-12Android串口开发之使用JNI实现ANDROID和串口通信详解
这篇文章主要给大家介绍了关于Android串口开发之使用JNI实现ANDROID和串口通信的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2018-01-01利用百度地图Android sdk高仿微信发送位置功能及遇到的问题
这篇文章给大家介绍了利用百度地图Android sdk高仿微信发送位置功能,在实现此功能的时候遇到点小问题,下面小编给大家列出来,需要的朋友参考下吧2017-12-12Android CalendarView,DatePicker,TimePicker,以及NumberPicker的使
这篇文章主要介绍了Android CalendarView,DatePicker,TimePicker,以及NumberPicker的使用的相关资料,需要的朋友可以参考下2016-12-12
最新评论