从 MediaStore 上的光标获取 uri 的路径

get path of uri from a cursor on MediaStore

我正在尝试做一个媒体播放器,第一步是扫描设备外部存储中可用的所有歌曲。之后,我会将它们存储在一个列表中,但我被困在了第一点。 (我不熟悉 Uri 或 Cursor,所以即使在研究 google 和 Whosebug 一段时间后我也不知道它们是如何工作的,也许这就是问题所在)

我希望能够将光标进入的每首歌曲存储在 class 歌曲的列表中,其中将包含艺术家、专辑、标题、持续时间和路径。我想稍后使用该路径来复制带有 mediaPlayer.setDataSource(path); 的歌曲,但我不知道如何获取它。

protected void getSongs() {

        ContentResolver contentResolver = this.getContentResolver();
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor = contentResolver.query(uri,null,MediaStore.Audio.Media.IS_MUSIC + " = 1",null,null);

        if (cursor!=null&&cursor.moveToFirst()){
            //retrieve index of columns
            int artistColumn=cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
            int albumColumn=cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
            int titleColumn=cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
            int durationColumn=cursor.getColumnIndex(MediaStore.Audio.Media.DURATION);
            //get path somehow
        }
        else {
            Toast.makeText(this, "Query failed", Toast.LENGTH_SHORT).show();
        }

方法未完成。我知道我遗漏了一些东西,但我找不到的唯一疑问是当前光标元素的路径。

提前致谢。

游标实际上是返回的数据集。想象它就像一个包含行(每个轨道)和列的电子表格。列包含单独的数据,一行代表一条记录。

通过获取其索引(即在电子表格中右侧的位置)来访问每一列 table

private final String track_id = MediaStore.Audio.Media._ID;
private final String bucket_displayname = MediaStore.Audio.Media.BUCKET_DISPLAY_NAME;
private final String track_no = MediaStore.Audio.Media.TRACK;
private final String track_name = MediaStore.Audio.Media.TITLE;
private final String artist = MediaStore.Audio.Media.ARTIST;
private final String artist_id = MediaStore.Audio.Media.ARTIST_ID;
private final String duration = MediaStore.Audio.Media.DURATION;
private final String album = MediaStore.Audio.Media.ALBUM;
private final String composer = MediaStore.Audio.Media.COMPOSER;
private final String year = MediaStore.Audio.Media.YEAR;
private final String path = MediaStore.Audio.Media.DATA;
private final String date_added = MediaStore.Audio.Media.DATE_ADDED;
private final String genre = MediaStore.Audio.Media.GENRE;
private final String genre_id = MediaStore.Audio.Media.GENRE_ID;

等等。请注意,有一个名为 MediaStore.Audio.Media.DATA 的列(除了 android10 之外 google 决定取消它只是为了在 11 中将其带回来) 因此,当您围绕光标循环时,您可以有效地阅读电子表格的每一行。