保存位图时设置日期

时间:2014-07-15 12:28:50

标签: java android image bitmap

我正在使用此功能来保存我的位图。

MediaStore.Images.Media.insertImage(getContentResolver(),
view.getDrawingCache(), "image.png", "image");

位图已成功保存,但图像上的日期为1.1.1970。

如何制作当前日期?

5 个答案:

答案 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);
    }
}