Android音乐播放器RecyclerView播放列表拖拽排序后MediaStore更新问题
Android音乐播放器拖拽排序后MediaStore播放列表不更新的坑
问题场景
最近在开发一款Android音乐播放器,功能推进得还算顺利:已经实现了播放列表创建、歌曲添加功能,甚至搞定了播放列表内歌曲的拖拽排序(RecyclerView项拖拽换位)。但遇到个头疼的问题——拖拽调整顺序后,MediaStore中的播放列表数据库明明更新了,我的应用却始终显示旧的歌曲顺序。
更奇怪的是,其他第三方音乐播放器打开同一个播放列表,能正常显示更新后的排序,唯独我的应用不行。
我一开始用来更新播放列表顺序的代码是这样的:
public static void trackMoved(int fromPosition, int toPosition) { Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", pID) .buildUpon() .appendEncodedPath(String.valueOf(fromPosition)) .appendQueryParameter("move", "true") .build(); ContentValues values = new ContentValues(); values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, toPosition); cr.update(uri, values, null, null) ; }
问题根源与解决方案
折腾了好一阵才发现问题出在哪:我在加载播放列表歌曲的时候,没有按照PLAY_ORDER字段进行排序!
其实代码里已经正确更新了MediaStore中对应歌曲的PLAY_ORDER值,但自己应用查询播放列表数据时,没有指定按这个字段排序,导致加载的还是默认的无序(或者旧排序逻辑)的结果;而其他音乐播放器在查询播放列表时,默认会遵循PLAY_ORDER的顺序加载,所以能正常展示更新后的排序。
解决方法超级简单:在查询播放列表歌曲的逻辑里,加上排序条件ORDER BY MediaStore.Audio.Playlists.Members.PLAY_ORDER ASC。比如用ContentResolver查询Cursor时,把排序参数设为这个字段;如果用了Room等ORM框架,就在查询注解里加上对应的排序语句。这样就能正确加载到更新后的播放列表顺序了。
内容的提问来源于stack exchange,提问作者Rektirino
相关产品推荐
相关产品推荐

