Android Java 从URI获取MP4路径供MediaExtractor调用失败怎么解决?
错误原因
content://开头的URI是系统内容提供器返回的共享文件标识,不是本地文件路径,调用Uri.getPath()得到的是内容提供器内部的映射路径,不是磁盘上的真实文件存储路径,直接传给仅接收本地路径的setDataSource(String path)方法必然抛出IO异常。
最简解决方案
不需要写复杂的URI转真实路径逻辑,直接使用MediaExtractor自带的重载方法,通过文件描述符加载内容即可,适配所有Android 4.4及以上版本的系统文件选择器返回结果:
Uri currFileURI = data.getData(); MediaExtractor extractor = new MediaExtractor(); try { AssetFileDescriptor afd = getContentResolver().openAssetFileDescriptor(currFileURI, "r"); // 传入偏移量和长度,适配切片共享文件场景,兼容性更强 extractor.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); afd.close(); } catch (IOException e) { e.printStackTrace(); return; }
方案优势
- 无需适配不同厂商、不同系统版本的URI路径规则,代码量仅几行
- 兼容所有合法的文件URI,包括下载目录、媒体库、第三方应用提供的共享文件
- 自动适配系统权限规则,只要拿到URI时获取了读取权限即可正常访问,无需额外申请存储权限
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

