在Android上保存到图库时,我遇到了一个奇怪的(奇怪的是具体的)问题。
一些背景知识:我正在开发的应用程序需要能够将图像保存到图库,这在前面已经进行了很好的讨论。但是,此项目有一个特定的要求,就是我需要能够使用特定的日期/时间对其进行标记。
我尝试了几种方法来使其正常工作,到目前为止,我最好的解决方法是
此刻我正在做的是生成图像,将其保存到文件中,并在EXIF数据中设置创建日期。然后,我打开Google相册应用,该应用会显示在图库中,显示正确的日期和时间,并且在图库中的正确位置。
此问题是,它不会自动显示在任何其他图库软件(例如,给定设备可能附带的OEM图库应用程序)中,也不会显示Google Photos应用程序是否保存时打开;必须关闭并重新启动它才能显示它。
现在,如果我运行媒体扫描,它将忽略EXIF数据,并且该图像显示为最后创建的图像。
这是我当前正在使用的代码:
static class InsertImageObj{
public String url;
public long id;
}
public static InsertImageObj insertImage(Bitmap source,
String title, long time) {
String path = createDirectoryAndSaveFile(source, title, time);
String stringUrl = path;
InsertImageObj retVal = new InsertImageObj();
retVal.url = stringUrl;
return retVal;
}
private static String createDirectoryAndSaveFile(Bitmap imageToSave, String fileName, long dateTime) {
File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); //DCIM = Digital Camera Image. This is where camera photos go!
if (!directory.exists()) {
directory.mkdirs();
}
File file = new File(directory, fileName);
if (file.exists()) {
file.delete();
}
try {
FileOutputStream out = new FileOutputStream(file);
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
ExifInterface ei = new ExifInterface(file.getAbsolutePath());
ei.setAttribute(ExifInterface.TAG_DATETIME, convertToExifDateTime(dateTime));
ei.setAttribute(ExifInterface.TAG_DATETIME_ORIGINAL, convertToExifDateTime(dateTime));
ei.setAttribute(ExifInterface.TAG_DATETIME_DIGITIZED, convertToExifDateTime(dateTime));
ei.saveAttributes();
} catch (Exception e) {
e.printStackTrace();
}
return file.getAbsolutePath();
}
private static String convertToExifDateTime(long timestamp) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.getDefault());
return sdf.format(new Date(timestamp));
}
我还尝试过在文件上运行setLastModified
(无效,操作系统权限或其他问题),并在保存后使用MediaScannerConnection
实例扫描单个文件。但是,后者会导致系统忽略Exif数据中的日期/时间标签。
我还尝试通过ContentResolver
实例将图像插入到图库中,并将DATE_ADDED
和DATE_TAKEN
字段设置为无效。
我在这里真的错过了什么吗?
答案 0 :(得分:1)
您需要将图像保存在媒体商店提供商中
使用此功能
public static void imageToGallery(Context context, String fileName) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.MediaColumns.DATA, fileName);
context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
因此,保存图像后,请致电imageToGallery
。
答案 1 :(得分:0)
图像仅在添加到android-media-db中时才在图库应用中可见。
您可以要求MediaScannerConnection.scanFile(...)
将新的照片文件添加到android-media-db。
在某些android设备上(但不是全部),mediascanner会自动启动。
还请注意:您应该将新照片另存为“ ... / DCIM / myApp / myPhotoName.jpg”而不是“ ... / DCIM / myPhotoName.jpg”
答案 2 :(得分:0)
使用此功能。它对我有用!
private void galleryAddPic() {
File f = new File(imageFilePath);
try {
MediaStore.Images.Media.insertImage(getActivity().getContentResolver(),
f.getAbsolutePath(), f.getName(), null);
getActivity().sendBroadcast(new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(f)));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}