这篇文章主要介绍了Android 图片保存到系统相册不显示的解决方案,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
前言
写了一个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 10及更高版本)
基础教程推荐
猜你喜欢
- android studio按钮监听的5种方法实例详解 2023-01-12
- Android开发使用RecyclerView添加点击事件实例详解 2023-06-15
- Android多返回栈技术 2023-04-15
- Android中的webview监听每次URL变化实例 2023-01-23
- Flutter手势密码的实现示例(附demo) 2023-04-11
- Flutter绘图组件之CustomPaint使用详解 2023-05-12
- IOS 播放系统提示音使用总结(AudioToolbox) 2023-03-01
- iOS开发教程之XLForm的基本使用方法 2023-05-01
- 解决Android Studio突然不显示logcat日志的问题 2023-02-04
- IOS应用内跳转系统设置相关界面的方法 2022-11-20
