如何使用Android 9以上版本的MediaStore.Video获取视频文件?

问题描述

我正在使用视频播放器应用。我的应用在android 9以下运行良好。我正在使用MediaStore.Video访问缩略图和其他数据。该代码不适用于android 9及更高版本。我已获得所有许可。在清单清单中,requestExternalStorageLeagacy设置为true。一切都在android 9以下运行。

public class VideoLoader {
private static final Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
private static final String mediaData = MediaStore.MediaColumns.DATA;
private static final String thumbData = MediaStore.Video.Thumbnails.DATA;
private static final String id = MediaStore.Video.Media._ID;
private static final String name = MediaStore.Video.Media.disPLAY_NAME;
private static final String duration = MediaStore.Video.Media.DURATION;
private static final String size = MediaStore.Video.Media.SIZE;
private static final String resolution = MediaStore.Video.Media.RESOLUTION;
private Context context;

public VideoLoader(Context context) {
    this.context = context;
}

public ArrayList<VideoData> runcursor(String sortOrder) {
    ArrayList<VideoData> videoList = new ArrayList<>();
    String[] projection = new String[]{
            mediaData,thumbData,id,name,duration,size,resolution
    };
    try {
        Cursor cursor = context.getContentResolver().query(
                uri,projection,null,sortOrder
        );
        // Cache column indices.
        assert cursor != null;
        int columnData = cursor.getColumnIndexOrThrow(mediaData);
        int thumbColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Thumbnails.DATA);
        int idColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID);
        int nameColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.disPLAY_NAME);
        int durationColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
        int sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE);
        int resolutionColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.RESOLUTION);
        /*int resolutionOfVideo = cursor.getColumnIndexOrThrow(resolution);*/
        String absolutePath,mediaDeFinition = null,mediaResolution;

        while (cursor.movetoNext()) {
            // Get values of columns for a given video.
            absolutePath = cursor.getString(columnData);
            String parentPath = Objects.requireNonNull(new 
            File(absolutePath).getParentFile()).getName();
            mediaResolution = cursor.getString(resolutionColumn);
           
            long id = cursor.getLong(idColumn);
            int resolution = cursor.getInt(resolutionColumn);
            Uri contentUri = ContentUris.withAppendedId(
                    MediaStore.Video.Media.EXTERNAL_CONTENT_URI,id);
            VideoData data = new VideoData();
            data.setPath(absolutePath);
            data.setName(cursor.getString(nameColumn));
            data.setTime(new File(absolutePath).lastModified());
            data.setDate(new File(absolutePath).lastModified());
            data.setFolder(parentPath);
            data.setDuration(cursor.getInt(durationColumn));
            data.setSize(cursor.getInt(sizeColumn));
            data.setResolution(mediaResolution);
            data.setMediaDeFinition(mediaDeFinition);
            videoList.add(data);
            Log.i("thumb"," === "+cursor.getString(thumbColumn));
            Log.i("name"," === "+cursor.getString(nameColumn));
            Log.i("folder"," === "+parentPath);
            Log.i("date"," === "+new File(absolutePath).lastModified());
            Log.i("duration"," === "+cursor.getInt(durationColumn));
            Log.i("size"," === "+cursor.getInt(sizeColumn));
            Log.i("resolution One Number"," === "+resolution);
            Log.i("resolution Two Number"," === "+mediaResolution);
            Log.i("quality"," === "+mediaDeFinition);
            Log.i("contentUri"," === "+contentUri);
        }
        cursor.close();
    } catch (IllegalArgumentException e) {
        e.printstacktrace();
    }
    return videoList;
}
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)