2020.0816 更新
之前的方法在部分Android10手机上,保存之后没有更新到相册,或者没保存成功,找了一下适配解决方案,并测试了一下,还算OK。更新一下。
Android 图片保存到本地,更新相册,并且打开微信发送图片的时候,可以被识别
测了一下,大部分手机都可以适配,不适配的再找别的吧
/**
* 保存文件,文件名为当前日期
*/
public static boolean saveBitmap(Bitmap bitmap) {
String fileName;
File file;
String brand = Build.BRAND;
if (brand.equals("xiaomi")) { // 小米手机brand.equals("xiaomi")
fileName = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/" + System.currentTimeMillis() + ".jpg";
} else if (brand.equalsIgnoreCase("Huawei")) {
fileName = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/" + System.currentTimeMillis() + ".jpg";
} else { // Meizu 、Oppo
fileName = Environment.getExternalStorageDirectory().getPath() + "/DCIM/" + System.currentTimeMillis() + ".jpg";
}
if (Build.VERSION.SDK_INT >= 29) {
return saveSignImage(bitmap);
} else {
file = new File(fileName);
}
if (file.exists()) {
file.delete();
}
FileOutputStream out;
try {
out = new FileOutputStream(file);
// 格式为 JPEG,照相机拍出的图片为JPEG格式的,PNG格式的不能显示在相册中
if (bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out)) {
out.flush();
out.close();
MediaStore.Images.Media.insertImage(getApplication().getContentResolver(), file.getAbsolutePath(), fileName, null);
}
} catch (FileNotFoundException e) {
Log.e("FileNotFoundException", "FileNotFoundException:" + e.getMessage().toString());
e.printStackTrace();
return false;
} catch (IOException e) {
Log.e("IOException", "IOException:" + e.getMessage().toString());
e.printStackTrace();
return false;
} catch (Exception e) {
Log.e("IOException", "IOException:" + e.getMessage().toString());
e.printStackTrace();
return false;
}
getApplication().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + fileName)));
return true;
}
public static boolean saveSignImage(Bitmap bitmap) {
try {
//设置保存参数到ContentValues中
ContentValues contentValues = new ContentValues();
//设置文件名
contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, System.currentTimeMillis() + ".jpg");
//兼容Android Q和以下版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
//android Q中不再使用DATA字段,而用RELATIVE_PATH代替
//RELATIVE_PATH是相对路径不是绝对路径
//DCIM是系统文件夹,关于系统文件夹可以到系统自带的文件管理器中查看,不可以写没存在的名字
contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, "DCIM/");
//contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, "Music/signImage");
} else {
contentValues.put(MediaStore.Images.Media.DATA, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath());
}
//设置文件类型
contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/JPEG");
//执行insert操作,向系统文件夹中添加文件
//EXTERNAL_CONTENT_URI代表外部存储器,该值不变
Uri uri = getApplication().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
if (uri != null) {
//若生成了uri,则表示该文件添加成功
//使用流将内容写入该uri中即可
OutputStream outputStream = getApplication().getContentResolver().openOutputStream(uri);
if (outputStream != null) {
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
outputStream.flush();
outputStream.close();
}
return true;
}
return false;
} catch (Exception e) {
return false;
}
}