Android 获取包含至少一个媒体文件(如照片/视频)的所有文件夹
Android get all folders that contain at least one media file like photo / video
我只需要包含至少一个以 eg 结尾的文件的文件夹路径。 .mp4 或 .jpg 。我已经检查过这个 thread: Android: how to get all folders with photos? 但它对我的用例来说太慢了。有更快的方法吗?
所以我终于找到了一个比上面提到的更快的解决方案。我在 ~100-150 毫秒(大约 3k 文件)内获得了所有包含图像的目录。在下面的示例中,将检查存储在内部或外部存储中的所有图像文件,并将父目录添加到数组列表中。我排除了 .gif 和 .giff 文件。
此方法也适用于视频,因此需要几个步骤:
- 将 queryUri 更改为 MediaStore.Video.Media.EXTERNAL_CONTENT_URI
- 将投影更改为MediaStore.Video.Media.DATA
- 将 includeImages 中的 'image/%' 更改为 'video/%'
- 从选择
中删除+ excludeGif
public static ArrayList<String> getImageDirectories(Context mContext) {
ArrayList<String> directories = new ArrayList<>();
ContentResolver contentResolver = mContext.getContentResolver();
Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = new String[]{
MediaStore.Images.Media.DATA
};
String includeImages = MediaStore.Images.Media.MIME_TYPE + " LIKE 'image/%' ";
String excludeGif = " AND " + MediaStore.Images.Media.MIME_TYPE + " != 'image/gif' " + " AND " + MediaStore.Images.Media.MIME_TYPE + " != 'image/giff' ";
String selection = includeImages + excludeGif;
Cursor cursor = contentResolver.query(queryUri, projection, selection, null, null);
if (cursor != null && cursor.moveToFirst()) {
do {
String photoUri = cursor.getString(cursor.getColumnIndex(projection[0]));
if(!directories.contains(new File(photoUri).getParent())){
directories.add(new File(photoUri).getParent());
}
} while (cursor.moveToNext());
}
return directories;
}
我只需要包含至少一个以 eg 结尾的文件的文件夹路径。 .mp4 或 .jpg 。我已经检查过这个 thread: Android: how to get all folders with photos? 但它对我的用例来说太慢了。有更快的方法吗?
所以我终于找到了一个比上面提到的更快的解决方案。我在 ~100-150 毫秒(大约 3k 文件)内获得了所有包含图像的目录。在下面的示例中,将检查存储在内部或外部存储中的所有图像文件,并将父目录添加到数组列表中。我排除了 .gif 和 .giff 文件。 此方法也适用于视频,因此需要几个步骤:
- 将 queryUri 更改为 MediaStore.Video.Media.EXTERNAL_CONTENT_URI
- 将投影更改为MediaStore.Video.Media.DATA
- 将 includeImages 中的 'image/%' 更改为 'video/%'
- 从选择 中删除+ excludeGif
public static ArrayList<String> getImageDirectories(Context mContext) {
ArrayList<String> directories = new ArrayList<>();
ContentResolver contentResolver = mContext.getContentResolver();
Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = new String[]{
MediaStore.Images.Media.DATA
};
String includeImages = MediaStore.Images.Media.MIME_TYPE + " LIKE 'image/%' ";
String excludeGif = " AND " + MediaStore.Images.Media.MIME_TYPE + " != 'image/gif' " + " AND " + MediaStore.Images.Media.MIME_TYPE + " != 'image/giff' ";
String selection = includeImages + excludeGif;
Cursor cursor = contentResolver.query(queryUri, projection, selection, null, null);
if (cursor != null && cursor.moveToFirst()) {
do {
String photoUri = cursor.getString(cursor.getColumnIndex(projection[0]));
if(!directories.contains(new File(photoUri).getParent())){
directories.add(new File(photoUri).getParent());
}
} while (cursor.moveToNext());
}
return directories;
}