【问题标题】:get path of uri from a cursor on MediaStore从 MediaStore 上的光标获取 uri 的路径
【发布时间】:2022-01-06 16:04:32
【问题描述】:

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

我希望能够将光标获得的每首歌曲存储在一个歌曲类的列表中,该列表将包含艺术家、专辑、标题、持续时间和路径。以后想用路径复现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();
        }

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

提前致谢。

【问题讨论】:

    标签: java android uri mediastore android-cursor


    【解决方案1】:

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

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

    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 时) 因此,当您在光标周围循环时,您可以有效地阅读电子表格的每一行。

    【讨论】:

    • 成功了。我使用了 private final String path = MediaStore.Audio.Media.DATA; 行,然后我可以像这样在 MediaPlayer 上设置数据源 mediaPlayer.setDataSource(songRepertory[songSelected].getPath());
    • parkorian,除非 songSelected 是返回的值,否则您不会使用 _DATA 列的结果,但是您不需要 .getpath,因为 _DATA 包含完整路径 afaik
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多