MediaStore.Video.Media.EXTERNAL_CONTENT_URI查看多视频的替代方案
解决方案
你遇到的差异是第三方图库App对单媒体URI的处理逻辑不同:多数图库收到单图片URI时会自动加载同目录下的所有相邻媒体支持滑动,但是对单视频URI默认仅加载当前文件,不关联同目录其他视频。下面是两种可行实现方案:
方案1:自定义预览页面(兼容性最优,推荐)
完全不受第三方图库实现限制,可100%还原需求效果,实现步骤如下:
- 先查询指定相机文件夹下的所有媒体(可同时包含图片和视频),按添加时间倒序排列,查询代码示例:
// 替换为你的相机输出文件夹绝对路径 String cameraFolderPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() + "/你的相机文件夹名/"; Uri queryUri = MediaStore.Files.getContentUri("external"); String[] projection = new String[]{ MediaStore.MediaColumns._ID, MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.MIME_TYPE, MediaStore.MediaColumns.DATA }; // 过滤出图片+视频,且属于指定文件夹的媒体 String selection = MediaStore.MediaColumns.MIME_TYPE + " LIKE ? OR " + MediaStore.MediaColumns.MIME_TYPE + " LIKE ? AND " + MediaStore.MediaColumns.DATA + " LIKE ?"; String[] selectionArgs = new String[]{"image/%", "video/%", "%" + cameraFolderPath + "%"}; // 按添加时间倒序,第一个就是最新媒体 String sortOrder = MediaStore.MediaColumns.DATE_ADDED + " DESC"; Cursor cursor = getContentResolver().query(queryUri, projection, selection, selectionArgs, sortOrder);
- 自定义预览Activity,用ViewPager2作为滑动容器,分别实现图片、视频的加载逻辑:图片可用Glide/Coil加载,视频可用ExoPlayer实现播放,将查询到的媒体列表传入适配器后,直接调用
viewPager2.setCurrentItem(0, false)即可默认展示最新媒体,天然支持左右滑动切换所有同目录内容。
方案2:调用系统图库适配
如果不想自定义页面,可通过新增Intent参数实现,仅兼容支持该参数的系统图库:
if(!mediaId.equals("")){ mediaUri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, Long.parseLong(mediaId)); } Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(mediaUri, "video/*"); // 指定默认打开的URI,部分图库会自动加载同目录所有视频 intent.putExtra(Intent.EXTRA_INITIAL_URI, mediaUri); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(intent);
原有代码可优化点
- 不要用
MediaStore.Images.ImageColumns的列查询视频,会出现列找不到的异常,统一用MediaStore.MediaColumns下的通用列 - 新增文件夹过滤条件,不要全局遍历所有媒体,避免不同文件夹同文件名冲突,同时提升查询效率
- 新增排序条件直接拿到最新媒体,不需要遍历匹配文件名,性能更高
内容的提问来源于stack exchange,提问作者Shuba. . S hetty
相关产品推荐
相关产品推荐

