无法从存储中获取所有视频文件 Android

Unable to get all Video files from storage Android

我正在使用以下方法从存储中获取视频文件。它只检索目录文件,但不读取子目录文件中的文件。

示例:- 我可以从 WhatsApp Video 读取文件,但在同一文件夹中有一个子文件夹名称 sent 我无法读取里面的文件。

任何帮助,我如何读取所有文件夹和子文件夹

public class GetVideos {

    @RequiresApi(api = Build.VERSION_CODES.Q)
    public void getAllVideosData(Context context, ArrayList<VideoViewInfo> AllVideosData) {

        String[] projection = new String[] {
                MediaStore.Video.Media._ID,
                MediaStore.Video.Media.TITLE,
                MediaStore.Video.VideoColumns.DATA,
                MediaStore.Video.Media.BUCKET_DISPLAY_NAME,
                MediaStore.Video.Media.DATE_TAKEN,
                MediaStore.Video.Media.DURATION,
                MediaStore.Video.Media.RESOLUTION,
                MediaStore.Video.Media.SIZE
    };

        Uri Video = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        String orderBy = MediaStore.Video.Media.DATE_TAKEN;

        @SuppressLint("Recycle")
        Cursor cur = context.getContentResolver().query(Video, projection,null,null,orderBy );
        assert cur != null;
        Log.i("ListingVideo"," query count=" + cur.getCount());

        if (cur.moveToNext()) {
            String id;
            String title;
            String filePath;
            String bucketName;
            String date;
            String duration;
            String resolution;
            String size;

            int tempId = cur.getColumnIndex(MediaStore.Video.Media._ID);
            int titleTemp = cur.getColumnIndex(MediaStore.Video.Media.TITLE);
            int filePathTemp = cur.getColumnIndex(MediaStore.Video.Media.DATA);
            int bucketTemp = cur.getColumnIndex(MediaStore.Video.Media.BUCKET_DISPLAY_NAME);
            int dateTemp = cur.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN);
            int durationTemp = cur.getColumnIndex(MediaStore.Video.Media.DURATION);
            int resolutionTemp = cur.getColumnIndex(MediaStore.Video.Media.RESOLUTION);
            int sizeTemp = cur.getColumnIndex(MediaStore.Video.Media.SIZE);
            do {
                id = cur.getString(tempId);
                title = cur.getString(titleTemp);
                filePath = cur.getString(filePathTemp);
                bucketName = cur.getString(bucketTemp);
                date = cur.getString(dateTemp);
                duration = cur.getString(durationTemp);
                resolution = cur.getString(resolutionTemp);
                size = cur.getString(sizeTemp);
                Log.d(TAG, "getAllVideosData: "+bucketName);
                VideoViewInfo vvi = new VideoViewInfo(id, title, filePath, bucketName, date, duration, resolution, size);
                AllVideosData.add(vvi);

            } while (cur.moveToNext());
        }
    }
}

我应该怎么做才能获得我存储中的所有视频文件?

Bountry reward i want to read every video file from storage with above code i can only read files limited location as per MediaStore.Video

您可以运行一个递归函数来列出所有视频文件,例如

void findVideos(File dir, ArrayList<String> list){
    for (File file : dir.listFiles()) {
        if (file.isDirectory()) findVideos(file, list);
        else if(file.getAbsolutePath().contains(".mp4")) list.add(file.getAbsolutePath());
    }
}

或者您可以像在此存储库中那样查询 mediastore here

It's really hard and full of a mess when doing file handling 因为您只访问文件,但是其中的子目录呢?在

的情况下

@Kursh 的回答递归也无济于事

因为它会深入子目录,永远不会回来18=]ASYNC TAK 或 协程