【问题标题】:How to get paths of folders that has image or video如何获取具有图像或视频的文件夹的路径
【发布时间】:2017-01-21 22:11:14
【问题描述】:

我想创建一个安卓图库应用。

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

我使用了这段代码并且工作了。但是当我将它与 Play 商店中的 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)) });
        }

    }

【问题讨论】:

  • 扫描所有文件夹。检查其中是否有照片或视频。列个清单。
  • @JasonC 请看我的第二个回答。
  • 编辑您的问题并添加您的答案。然后删除你的答案。
  • @Sadeq "Post Answer" 不适用于向问题添加详细信息。问题下方有一个编辑按钮是有原因的。
  • 好的,我编辑了我的帖子,对不起。

标签: java android directory gallery photos


【解决方案1】:

我可以看到您正在尝试获取包含视频文件的所有文件夹的文件夹名称@prakash ubhadiya 给出的答案是一个很好的工作,但如果存在许多具有相同名称的此类文件夹,则该函数将保留只有一个而忽略其余的,下面我修改了他的功能,不仅返回文件夹名称,还返回文件夹绝对路径,以防你想用它来获取该特定文件夹中的所有视频文件,我创建了一个类称为floderFacer 保存文件夹名称和文件夹绝对路径,这样做不会忽略具有相同名称的文件夹下面是类

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;
    }
} 

现在下面是修改后的函数,它将在 folderFacer 对象中返回文件夹名称和路径,全部在 ArrayList&lt;folderFacer&gt;

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;
    }

希望对你有帮助

【讨论】:

  • 有 github 例子吗?或者你能用这个github.com/abdullah432/SAFProject
  • 嗨@sanojlawrence
  • 如何将 github 与您的代码结合起来?显示文件的文件夹名称?
  • 我为所有访问 MediaStore 中的媒体内容轻松创建了一个 android 类库,该库现在是第三版,目前正在开发另一个版本,并创建一个 Xamarin.Android 等价物,这是 GitHub 上的库github.com/CodeBoy722/MediaFacer,请务必阅读 Readme.md 中的 Medium 文章以了解其工作原理
  • 使用该库非常简单,按照Readme.md中的步骤先将其添加到您的项目中
【解决方案2】:

这样您就可以找到所有的视频和图片父级。

ArrayList<String> allFolder;
    HashMap<String, ArrayList<String>> listImageByFolder;
    ArrayList<String> allVideoFolder;
    HashMap<String, ArrayList<String>> listVideoByFolder;

查找所有图片文件夹路径 私人无效 getImageFolderList() {

        String[] projection = new String[] { MediaStore.Images.Media.DATA,
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
                MediaStore.Images.Media.DATE_TAKEN };
        Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        final String orderBy = MediaStore.Images.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.Images.Media.BUCKET_DISPLAY_NAME);
            int dateColumn = cur.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN);
            do {
                bucket = cur.getString(bucketColumn);
                date = cur.getString(dateColumn);
                if (!allFolder.contains(bucket)) {
                    allFolder.add(bucket);
                }
                imagePath = listImageByFolder.get(bucket);
                if (imagePath == null) {
                    imagePath = new ArrayList<String>();
                }
                imagePath.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());
        }
    }

【讨论】:

  • 谢谢你,它的工作就像一个魅力。但是当我们在 ExternalStorage 和 SDcard Like(Camera 文件夹)中有 2 个同名文件夹时,此代码会返回其中一个。
  • @Sadeq Nameni 您可以为此使用 BUCKET_ID,因为每个文件夹的存储桶 ID 都是唯一的。
猜你喜欢
  • 2012-04-29
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2014-02-12
  • 2021-02-05
  • 2016-01-21
相关资源
最近更新 更多