找不到歌曲,同时从播放列表中获得音频ID
我想根据特定的播放列表获取歌曲。我获取所有歌曲的音频编号,但没有得到任何其他信息,如标题,艺术家,专辑等。我也试过 this这与我的问题是一样的。
这是我怎么添加歌曲到播放列表:找不到歌曲,同时从播放列表中获得音频ID
public static void addToPlaylist(ContentResolver resolver, long audioId, int playlistId) {
String[] cols = new String[] {
"count(*)"
};
Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId);
Cursor cur = resolver.query(uri, cols, null, null, null);
cur.moveToFirst();
final int base = cur.getInt(0);
cur.close();
ContentValues values = new ContentValues();
values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, Integer.valueOf(base +(int) audioId));
values.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, audioId);
Uri u =resolver.insert(uri, values);
Log.d("ItemFragment", "Added Playlist Item: " + u + " for AUDIO_ID " + audioId+" and PLAYLIST_ID = "+playlistId);
}
,然后我检索特定播放列表的歌曲是这样的:
public ArrayList<AudioFile> getSongListFromPlayList() {
ArrayList<AudioFile> audioFiles = new ArrayList<>();
String[] proj = { MediaStore.Audio.Playlists.Members.AUDIO_ID};
Cursor musicCursor = musicResolver.query(MediaStore.Audio.Playlists.Members.getContentUri("external",id)
, proj, null, null, null);
int x = 0;
Log.d(TAG,"cursor count : "+musicCursor.getCount());
if ((musicCursor != null) && (musicCursor.moveToFirst())) {
do {
long a_id = musicCursor.getLong(musicCursor.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
Uri mediaContentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[] projection = new String[]{MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID};
String selection = MediaStore.Audio.Media._ID + "=?";
String[] selectionArgs = new String[]{"" + a_id}; //This is the id you are looking for
Cursor mediaCursor = musicResolver.query(mediaContentUri, projection, selection, selectionArgs, null);
Log.d(TAG,"second cursor count : "+mediaCursor.getCount());
if (mediaCursor.getCount() > 0) {
mediaCursor.moveToPosition(0);
String title = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String album = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
String artist = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String data = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String duration = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
long id = mediaCursor.getLong(mediaCursor.getColumnIndex(MediaStore.Audio.Media._ID));
audioFiles.add(new AudioFile(id,title,artist,data,duration,x));
x++;
}
}while (musicCursor.moveToNext());
}
Log.d(TAG,"size : "+audioFiles.size());
return audioFiles;
}
和调试时我得到日志:
D/SecondActivity:游标数:11
D/SecondActivity:第二游标数:1
d/SecondActivity:第二光标计数:0
d/SecondActivity:第二光标计数:0
d/SecondActivity:第二光标计数:0
d/SecondActivity:第二光标计数:0
d/SecondActivity:第二光标计数:0
d/SecondActivity:第二光标计数:0
d/SecondActivity:第二光标计数:0
d/SecondActivity:第二光标计数:0
d/SecondActivity:第二光标计数:0
D/SecondActivity:第二个游标数:0
D/SecondActivity:size:1
请大家帮忙。
您需要枚举光标并向前移动,直到达到最终。一旦你有你的音乐光标,使用这样的东西循环它
if(musicCursor!= null && musicCursor.moveToFirst()){
for (musicCursor.moveToFirst(); !musicCursor.isAfterLast(); musicCursor.moveToNext()) {
// do your stuff here, as you cycle through your musicCursor you will read the next audio_id which then gets the relevant data
}
}
for循环将枚举游标。移除moveto位置, 将uri带到循环之外。如果你在这个类中有几个方法,把它放在最前面,这样它就可以用于所有的方法,但你只需定义一次。定义投影只需要在for循环之外进行一次。 我已编辑你的代码有点
public ArrayList<AudioFile> getSongListFromPlayList() {
ArrayList<AudioFile> audioFiles = new ArrayList<>();
String[] proj = { MediaStore.Audio.Playlists.Members.AUDIO_ID};
Cursor musicCursor = musicResolver.query(MediaStore.Audio.Playlists.Members.getContentUri("external",id)
, proj, null, null, null);
String[] projection = new String[]{MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID};
String selection = MediaStore.Audio.Media._ID + "=?";
if ((musicCursor != null) && (musicCursor.moveToFirst())) {
for (musicCursor.moveToFirst(); !musicCursor.isAfterLast(); musicCursor.moveToNext()) {
long a_id = musicCursor.getLong(musicCursor.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
String[] selectionArgs = new String[]{"" + a_id}; //This is the id you are looking for
Cursor mediaCursor = musicResolver.query(mediaContentUri, projection, selection, selectionArgs, null);
String title = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String album = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
String artist = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String data = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String duration = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
long id = mediaCursor.getLong(mediaCursor.getColumnIndex(MediaStore.Audio.Media._ID));
audioFiles.add(new AudioFile(id,title,artist,data,duration,x));
}
}
Log.d(TAG,"size : "+audioFiles.size());
return audioFiles;
我尝试过,但没有奏效 –
等什么接下来会发生?简单地说它不起作用并不是真的有用。 – Theo
其实这是我的错。我在“addToPlaylist”方法中传递了错误的“id”。这不是我之前创建的任何播放列表。所以我改变了,代码工作正常。谢谢你的帮助。 –
删除我的评论 – Theo