android - 从 FileDescriptor 或 ParcelFileDescriptor 获取视频时长
问题描述
我一直在使用这种类型的代码来获取我的 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.openFileDescriptor
ParcelFileDescriptor
FileDescriptor
我还尝试了其他可能的解决方案,但都没有奏效:
- 使用
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);
所以,是的,我对任何可行的想法持开放态度。谢谢!
解决方案
推荐阅读
- r - 阈值的相关变量
- angularjs - Angular 在指令模板中进行插值,有时不会?
- python - 一次访问数组中的一行
- python - 有没有办法运行命令“脚本
" 不是直接在终端上,而是在我的 Python 脚本中? - javascript - 用表单输入替换 div 内容/值
- r - cnlp_annotate 不从 R 中的元数据帧返回字段
- android - 在 Android 中以编程方式使背景“透视”
- java - 如何使用 TestNg 记录测试历史?
- javascript - 如何在没有 instagram API 的情况下从 instagram 获取公共用户的所有帖子
- java - 如何以编程方式检查 RMI 类加载器是否已启用