我正在使用此功能来保存我的位图。
MediaStore.Images.Media.insertImage(getContentResolver(),
view.getDrawingCache(), "image.png", "image");
位图已成功保存,但图像上的日期为1.1.1970。
如何制作当前日期?
答案 0 :(得分:2)
您无法使用MediaStore.Images.Media
来设置日期。
ContentValues values = new ContentValues();
values.put(Media.TITLE, title);
values.put(Media.DESCRIPTION, description);
values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis()); // DATE HERE
values.put(Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.MediaColumns.DATA, filepath);
context.getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
如果您需要任何其他指示,我会看看MediaStore.Images.Media.insertImage
答案 1 :(得分:1)
MediaStore的insertImage将图像添加到商店并创建/更新ImageColumns记录。
此记录包含 DATE_ADDED字段,这是您要查找的字段。
它还包含一个与添加时间无关的DATE_TAKEN字段。它表示日期 其中拍摄的图像几乎总是从图像中拍摄(更准确地说:来自 将旧图像添加到商店时,不会更改其EXIF数据)。
我怀疑你的问题来自于阅读先前而不是后者,正如你应该的那样。 要为所有图像检索此字段:
String[] projection = new String[]{
MediaStore.Images.Media._ID,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.DATE_ADDED // <-----------------
};
Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor cur = managedQuery(images, projection, "", null, "");
您可能希望过滤一个(或几个)特定图像。
BTW 1.1.1970表示&#34;找不到拍摄日期的图像&#34;,这不应该发生在 在现代设备上拍的照片。
答案 2 :(得分:1)
可以确认在4.1.2设备上,Gallery应用程序也显示1970年的jpg。但是文件浏览器会显示正确的文件时间。因此,Gallery应用程序可能会提取Exif信息。
在KitKat 4.4.2设备上,Gallery应用程序显示正确的日期。文件资源管理器指示的文件时间也不正确。
我很惊讶图片已保存在../ DCIM /相机中。
但无论如何jpg总是携带文件时间,因为文件名是文件时间。这些图片保存为1405427951171.jpg
,翻译为15-07-2014 ......和1405427951171是1970年以后的毫秒数。
答案 3 :(得分:1)
您可以使用标准MediaStore.Images.Media.insertImage()
方法,然后手动更新日期时间:
public void insertInMediaStore(Bitmap bitmap, String title,
String description, ContentResolver contentResolver) {
// insert to media store
String photoUriStr = MediaStore.Images.Media.insertImage(
contentResolver,
bitmap,
title ,
description);
Uri photoUri = Uri.parse(photoUriStr);
// add datetime
long now = System.currentTimeMillis() / 1000;
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATE_ADDED, now);
values.put(MediaStore.Images.Media.DATE_MODIFIED, now);
values.put(MediaStore.Images.Media.DATE_TAKEN, now);
contentResolver.update(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values,
MediaStore.Images.Media._ID + "=?",
new String [] { ContentUris.parseId(photoUri) + "" });
// call media scanner to refresh gallery
Intent scanFileIntent = new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, photoUri);
MyApp.getInstance().sendBroadcast(scanFileIntent);
}
答案 4 :(得分:0)
向this answer,添加信息对我有用的信息不仅包括DATE_TAKEN
,还包括DATE_ADDED
:
values.put(Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000); // should be in unit of seconds
values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis()); // should be in unit of ms
我接受了代码from a comment here并使用了它:
public void addLastPhotoToGallery(String photoPath) {
if (!Strings.isNullOrEmpty(photoPath)) {
ContentValues values = new ContentValues();
// Add the date meta data to ensure the image is added at the front of the gallery
values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis());
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.MediaColumns.DATA, photoPath);
getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File photoFile = new File(photoPath);
Uri contentUri = Uri.fromFile(photoFile);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
}
}