【问题标题】:Set date when saving bitmap保存位图时设置日期
【发布时间】:2014-07-15 12:28:49
【问题描述】:

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

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

位图保存成功,但是图片上的日期是1.1.1970。

如何设置当前日期?

【问题讨论】:

  • the date on the image ?你什么意思?文件时间? Exif时间?嗯 png 没有 exif...

标签: java android image bitmap


【解决方案1】:

你不能用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

【讨论】:

    【解决方案2】:

    您可以使用标准的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);
    }
    

    【讨论】:

      【解决方案3】:

      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 表示“找不到拍摄日期内部图像”,这不应该发生在 在现代设备上拍摄的照片。

      【讨论】:

        【解决方案4】:

        可以确认,在 4.1.2 设备上,图库应用也显示 1970 的 jpg。但是文件资源管理器显示的文件时间是正确的。因此,Gallery 应用程序可能会提取 Exif 信息。

        在 KitKat 4.4.2 设备上,图库应用显示正确的日期。文件浏览器指示的文件时间也是正确的。

        我很惊讶图片被保存在 ../DCIM/Camera 中。

        但无论如何,jpg总是带有文件时间,因为文件名是文件时间。这些图片保存为1405427951171.jpg,翻译为 15-07-2014 ......而 1405427951171 是 1970 年之后的毫秒数。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-13
            • 2017-08-25
            相关资源
            最近更新 更多