1

我一直在使用这种类型的代码来获取我的 Android 设备上视频的持续时间:

            int dataColumn = cursor
                    .getColumnIndex(MediaStore.Files.FileColumns.DATA);
            String path = cursor.getString(dataColumn);

            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
            File file = new File(path);
            retriever.setDataSource(context, Uri.fromFile(file));
            boolean hasVideo = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO).equals("yes");
            String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
            int duration = 0;
            if (time != null && hasVideo) {
                duration = (int) Math.ceil(Integer.parseInt(time) / 1000);
            }

这一直有效,直到我开始在我的应用程序中定位 Android 11(API 级别 30)。现在持续时间总是报告为0。我可以看到它从 Android 10 (API level 29) 开始就MediaStore.Files.FileColumns.DATA被弃用了,并且是推荐的替代方案。但是,我不知道如何从 a或. 我也无法找到演示如何做到这一点的资源。那么,我该怎么做呢?ContentResolver.openFileDescriptorParcelFileDescriptorFileDescriptor

我还尝试了其他可能的解决方案,但都没有奏效:

  • 使用retriever.setDataSource(file.getAbsolutePath())而不是retriever.setDataSource(context, Uri.fromFile(file)). 我在这里这里看到了,所以我尝试了一下,但没有成功(持续时间仍然为零)
  • 我尝试直接从 查询持续时间字段,MediaStore但它仍然不起作用。这是我使用的代码:
                            int vidDurationColumn = cursor.getColumnIndex(MediaStore.Video.Media.DURATION);
                            int duration = (int)cursor.getInt(vidDurationColumn);

所以,是的,我对任何可行的想法持开放态度。谢谢!

4

0 回答 0