保存到图库-Android

时间:2019-06-03 13:10:46

标签: android

在Android上保存到图库时,我遇到了一个奇怪的(奇怪的是具体的)问题。

一些背景知识:我正在开发的应用程序需要能够将图像保存到图库,这在前面已经进行了很好的讨论。但是,此项目有一个特定的要求,就是我需要能够使用特定的日期/时间对其进行标记。

我尝试了几种方法来使其正常工作,到目前为止,我最好的解决方法是

此刻我正在做的是生成图像,将其保存到文件中,并在EXIF数据中设置创建日期。然后,我打开Goog​​le相册应用,该应用会显示在图库中,显示正确的日期和时间,并且在图库中的正确位置。

此问题是,它不会自动显示在任何其他图库软件(例如,给定设备可能附带的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_ADDEDDATE_TAKEN字段设置为无效。

我在这里真的错过了什么吗?

3 个答案:

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