从 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 中将其带回来)
因此,当您围绕光标循环时,您可以有效地阅读电子表格的每一行。
我正在尝试做一个媒体播放器,第一步是扫描设备外部存储中可用的所有歌曲。之后,我会将它们存储在一个列表中,但我被困在了第一点。 (我不熟悉 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 中将其带回来) 因此,当您围绕光标循环时,您可以有效地阅读电子表格的每一行。