You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:24:11