Android 10 如何在插入媒体时按当前时间更改 date_taken?

标签 android android-10.0

我将一个视频插入到媒体存储中,但在插入我的图库后排序错误,因为 date_taken 不是当前时间,系统使用在视频元数据中创建的时间。如何将 date_taken 更改为媒体存储或元数据中的当前时间?

ExifInterface 可以编辑元数据中的 date_created 但它只支持 JPEG 。

这是我用来插入视频的代码

        ContentValues contentvalues = new ContentValues();
        contentvalues.put(MediaStore.Video.VideoColumns.TITLE, title);
        contentvalues.put(MediaStore.Video.VideoColumns.DISPLAY_NAME, fileName);
        contentvalues.put(MediaStore.Video.VideoColumns.DATE_TAKEN, System.currentTimeMillis());
        contentvalues.put(MediaStore.Video.VideoColumns.DATE_ADDED, Long.valueOf(System.currentTimeMillis() / 1000));                     
        contentvalues.put(MediaStore.Video.VideoColumns.DATE_MODIFIED, Long.valueOf(System.currentTimeMillis() / 1000));
        contentvalues.put(MediaStore.Video.VideoColumns.MIME_TYPE, MIME_TYPE_VIDEO);
        contentvalues.put(MediaStore.Video.VideoColumns.RELATIVE_PATH, EnvironmentWrappper.RELATIVE_PATH_VIDEO);
        contentvalues.put(MediaStore.Video.VideoColumns.SIZE, outputFile.length());

        long duration = 0;
        List<Metadata> metadataList = VideoPreviewMetadataManager.loadMetaDataLite(outputPath);
        if (metadataList != null && !metadataList.isEmpty()) {
            for (Metadata metadata : metadataList) {
                if (ZMediaMetadataRetriever.METADATA_KEY_DURATION.equals(metadata.getKey())) {
                    duration = Long.parseLong(metadata.getValue().toString());
                }
            }
        }
        contentvalues.put(MediaStore.Video.VideoColumns.DURATION, duration);
        try {
            Uri uri = resolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, contentvalues);

             FileLocalUriWrapper file = new FileLocalUriWrapper(outputPath);
             OutputStream fos = resolver.openOutputStream(uri);
             InputStream inputStream = file.getFileInputStream();
             IOUtils.copyStream(inputStream, fos);
             fos.close();
             inputStream.close();

        } catch (Exception ex) {
            ex.printStackTrace();

        }

最佳答案

因为我没有androidQ的真机,我用模拟器测试的结果,好像DATE_TAKEN这个属性在androidQ中没有作用,甚至很多时候都是NULL。

所以我之前在androidQ中根据DATA_TAKEN获取时间属性,之后根据ADD_DATE获取AndroidQ中的时间属性。


当然这只是我自己的经验,不同的设备,可能从api28升级到29的设备可能会保留在MediaStore中。

关于Android 10 如何在插入媒体时按当前时间更改 date_taken?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57815521/

相关文章:

android - 以 Android Q 为目标时构建失败,但在 API 28 上使用 "Failed to transform file ' android.jar' 来匹配属性”

java - 如何在 Android 10 中打开 Activity (传入 voip 调用)

android - 如何在 Android Q 中请求外部文件访问权限?

java - 如何使用 Android Studio 列出 android 10 目录中的所有文件?

java - 如何异步接收来自Web的数据并在下一行代码中使用结果字符串?

Android 将事件添加到 CustomPreference 元素 (TextView)

java - 为什么我对位于/data/user_de/中的文件的权限被拒绝

android - 向 Gradle 文件添加新依赖项时出错?

android - 如何在 android 的 PagerAdapter 中不重复对象 instantiateItem()

java - 如何在 Android SDK API 级别 29 或更高版本中获取 IMSI 号码?