Java 如何获取包含图像或视频的文件夹的路径

Java 如何获取包含图像或视频的文件夹的路径,java,android,directory,gallery,photos,Java,Android,Directory,Gallery,Photos,我想创建一个android gallery应用程序 如何扫描和获取包含照片或视频的文件夹路径 我用这个代码工作。但当我将其与play store中的Quickpic Gallery进行比较时,我发现我的应用程序中的文件夹数少于Quickpic文件夹数 你认为这个代码有什么问题吗 Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Cursor cursor = ba.context.getContentResol

我想创建一个android gallery应用程序

如何扫描和获取包含照片或视频的文件夹路径

我用这个代码工作。但当我将其与play store中的Quickpic Gallery进行比较时,我发现我的应用程序中的文件夹数少于Quickpic文件夹数

你认为这个代码有什么问题吗

        Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    Cursor cursor = ba.context.getContentResolver().query(uri, null, null,
            null, MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME);
    if (cursor != null) {
        cursor.moveToFirst();
        int data = cursor
                .getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        int displayName = cursor
                .getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME);
        imageFolders = new HashMap<>();
        do {
            String imageAddress = cursor.getString(data);
            String imageName = cursor.getString(displayName);
            String folderAddress = imageAddress.substring(0,
                    imageAddress.lastIndexOf(imageName) - 1);

            if (!imageFolders.containsKey(folderAddress)) {
                imageFolders.put(folderAddress, imageAddress);
            }
        } while (cursor.moveToNext());
        for (String str : imageFolders.keySet()) {

            ba.raiseEventFromDifferentThread(
                    null,
                    null,
                    0,
                    "result",
                    true,
                    new Object[] { String.format("%s", str),
                            String.format("%s", imageFolders.get(str)) });
        }

    }
uriuri=MediaStore.Images.Media.EXTERNAL\u CONTENT\u Uri;
Cursor Cursor=ba.context.getContentResolver().query(uri,null,null,
null,MediaStore.Images.ImageColumns.BUCKET\u DISPLAY\u NAME);
如果(光标!=null){
cursor.moveToFirst();
int数据=光标
.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
int displayName=光标
.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY\u NAME);
imageFolders=新建HashMap();
做{
字符串imageAddress=cursor.getString(数据);
String imageName=cursor.getString(displayName);
字符串folderAddress=imageAddress.substring(0,
imageAddress.lastIndexOf(imageName)-1);
如果(!imageFolders.containsKey(folderAddress)){
imageFolders.put(folderAddress,imageAddress);
}
}while(cursor.moveToNext());
对于(字符串str:imageFolders.keySet()){
ba.raiseeventfromthread不同(
无效的
无效的
0,
“结果”,
符合事实的
新对象[]{String.format(“%s”,str),
格式(“%s”,imageFolders.get(str))});
}
}

通过这种方式,您可以找到所有视频和图像家长

ArrayList<String> allFolder;
    HashMap<String, ArrayList<String>> listImageByFolder;
    ArrayList<String> allVideoFolder;
    HashMap<String, ArrayList<String>> listVideoByFolder;
arraylistallfolder;
HashMapListImageByFolder;
ArrayList allVideoFolder;
HashMapListVideoByFolder;
查找所有图像文件夹路径 私有void getImageFolderList(){

String[]projection=新字符串[]{MediaStore.Images.Media.DATA,
MediaStore.Images.Media.\u ID,
MediaStore.Images.Media.BUCKET\u显示\u名称,
MediaStore.Images.Media.DATE_take};
Uri images=MediaStore.images.Media.EXTERNAL\u CONTENT\u Uri;
最终字符串orderBy=MediaStore.Images.Media.DATE\u;
Cursor cur=getContentResolver().query(图像、投影,//哪个
//纵队
//归来
null,//返回哪些行(所有行)
null,//选择参数(无)
orderBy+“DESC”//Ordering
);
阵列列表图像路径;
if(cur.moveToFirst()){
串桶,日期;
int bucketColumn=cur.getColumnIndex(MediaStore.Images.Media.BUCKET\u DISPLAY\u NAME);
int dateColumn=cur.getColumnIndex(MediaStore.Images.Media.DATE_take);
做{
bucket=cur.getString(bucketColumn);
日期=cur.getString(dateColumn);
如果(!allFolder.contains(bucket)){
allFolder.add(bucket);
}
imagePath=listImageByFolder.get(bucket);
if(imagePath==null){
imagePath=newarraylist();
}
add(cur.getString(cur
.getColumnIndex(MediaStore.Images.Media.DATA));
listImageByFolder.put(bucket,imagePath);
}while(cur.moveToNext());
}
}
查找所有视频文件夹路径

    private void getVideoFolderList() {
        String[] projection = new String[] { MediaStore.Video.Media.DATA,
                MediaStore.Video.Media._ID,
                MediaStore.Video.Media.BUCKET_DISPLAY_NAME,
                MediaStore.Video.Media.DATE_TAKEN };
        Uri images = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        final String orderBy = MediaStore.Video.Media.DATE_TAKEN;
        Cursor cur = getContentResolver().query(images, projection, // Which
                                                                    // columns
                                                                    // to return
                null, // Which rows to return (all rows)
                null, // Selection arguments (none)
                orderBy + " DESC" // Ordering
        );
        ArrayList<String> imagePath;
        if (cur.moveToFirst()) {
            String bucket, date;
            int bucketColumn = cur.getColumnIndex(MediaStore.Video.Media.BUCKET_DISPLAY_NAME);
            int dateColumn = cur.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN);
            do {
                bucket = cur.getString(bucketColumn);
                date = cur.getString(dateColumn);
                if (!allVideoFolder.contains(bucket)) {
                    allVideoFolder.add(bucket);
                }
                imagePath = listVideoByFolder.get(bucket);
                if (imagePath == null) {
                    imagePath = new ArrayList<String>();
                }
                imagePath.add(cur.getString(cur
                        .getColumnIndex(MediaStore.Images.Media.DATA)));
                listVideoByFolder.put(bucket, imagePath);
            } while (cur.moveToNext());
        }
    }
private void getVideoFolderList(){
字符串[]投影=新字符串[]{MediaStore.Video.Media.DATA,
MediaStore.Video.Media.\u ID,
MediaStore.Video.Media.BUCKET\u显示\u名称,
MediaStore.Video.Media.DATE_take};
Uri images=MediaStore.Video.Media.EXTERNAL\u CONTENT\u Uri;
最终字符串orderBy=MediaStore.Video.Media.DATE\u;
Cursor cur=getContentResolver().query(图像、投影,//哪个
//纵队
//归来
null,//返回哪些行(所有行)
null,//选择参数(无)
orderBy+“DESC”//Ordering
);
阵列列表图像路径;
if(cur.moveToFirst()){
串桶,日期;
int bucketColumn=cur.getColumnIndex(MediaStore.Video.Media.BUCKET\u DISPLAY\u NAME);
int dateColumn=cur.getColumnIndex(MediaStore.Video.Media.DATE_take);
做{
bucket=cur.getString(bucketColumn);
日期=cur.getString(dateColumn);
如果(!allVideoFolder.contains(bucket)){
allVideoFolder.add(bucket);
}
imagePath=listVideoByFolder.get(bucket);
if(imagePath==null){
imagePath=newarraylist();
}
add(cur.getString(cur
.getColumnIndex(MediaStore.Images.Media.DATA));
listVideoByFolder.put(bucket,imagePath);
}while(cur.moveToNext());
}
}

我可以看到您正在尝试获取包含视频文件的所有文件夹的文件夹名称@prakash ubhadiya给出的答案很好,但对于一个问题,@prakash ubhadiya给出的答案是有效的,但如果有许多同名文件夹,函数将只保留一个,而忽略其余文件夹,下面,我修改了他的函数,不仅返回文件夹名称,还返回文件夹绝对路径。如果您想使用此函数获取该特定文件夹中的所有视频文件,我创建了一个名为
floderFacer的类    private void getVideoFolderList() {
        String[] projection = new String[] { MediaStore.Video.Media.DATA,
                MediaStore.Video.Media._ID,
                MediaStore.Video.Media.BUCKET_DISPLAY_NAME,
                MediaStore.Video.Media.DATE_TAKEN };
        Uri images = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        final String orderBy = MediaStore.Video.Media.DATE_TAKEN;
        Cursor cur = getContentResolver().query(images, projection, // Which
                                                                    // columns
                                                                    // to return
                null, // Which rows to return (all rows)
                null, // Selection arguments (none)
                orderBy + " DESC" // Ordering
        );
        ArrayList<String> imagePath;
        if (cur.moveToFirst()) {
            String bucket, date;
            int bucketColumn = cur.getColumnIndex(MediaStore.Video.Media.BUCKET_DISPLAY_NAME);
            int dateColumn = cur.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN);
            do {
                bucket = cur.getString(bucketColumn);
                date = cur.getString(dateColumn);
                if (!allVideoFolder.contains(bucket)) {
                    allVideoFolder.add(bucket);
                }
                imagePath = listVideoByFolder.get(bucket);
                if (imagePath == null) {
                    imagePath = new ArrayList<String>();
                }
                imagePath.add(cur.getString(cur
                        .getColumnIndex(MediaStore.Images.Media.DATA)));
                listVideoByFolder.put(bucket, imagePath);
            } while (cur.moveToNext());
        }
    }
public class folderFacer {

    private String path;
    private String folderName;

    public folderFacer(){

    }

    public folderFacer(String path, String folderName) {
        this.path = path;
        this.folderName = folderName;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public String getFolderName() {
        return folderName;
    }

    public void setFolderName(String folderName) {
        this.folderName = folderName;
    }
} 
private ArrayList<folderFacer> getVideoPaths(){
        ArrayList<folderFacer> videoFolders = new ArrayList<>();
        ArrayList<String> videoPaths = new ArrayList<>();
        Uri allVideosuri = android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        String[] projection = { MediaStore.Video.VideoColumns.DATA ,MediaStore.Video.Media.DISPLAY_NAME,
                MediaStore.Video.Media.BUCKET_DISPLAY_NAME,MediaStore.Video.Media.BUCKET_ID};
        Cursor cursor = getContentResolver().query(allVideosuri, projection, null, null, null);

        try {
            cursor.moveToFirst();
            do{

                folderFacer folds = new folderFacer();

              String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME));
              String folder = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.BUCKET_DISPLAY_NAME));
              String datapath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));

              String folderpaths =  datapath.replace(name,"");
                if (!videoPaths.contains(folderpaths)) {
                    videoPaths.add(folderpaths);

                    folds.setPath(folderpaths);
                    folds.setFolderName(folder);
                    videoFolders.add(folds);
                }

            }while(cursor.moveToNext());

            cursor.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        for(int i = 0;i < videoFolders.size();i++){

            Log.d("video folders",videoFolders.get(i).getFolderName()+" and path = "+videoFolders.get(i).getPath());

        }

        return videoFolders;
    }