XamarinMediaManager:设置MediaQueue的CurrentIndex无效问题求助
解决XamarinMediaManager播放队列起始位置设置问题
我正好遇过类似的困扰,咱们一步步把这个问题搞定!你尝试的两种方法没生效,核心原因是播放流程的时机没把控好——要么是先触发播放导致索引被重置,要么是异步操作没完成就修改了索引。
为什么你的代码没生效?
- 示例1里,你先调用
Play(media),这时候MediaManager会自动初始化队列并启动播放第一个音频(A),之后再修改CurrentIndex=1会被播放的初始化流程覆盖,所以没效果。 - 示例2里,手动添加队列后设置了索引,但最后调用的
Prepare()只是完成播放准备,没有明确触发从当前索引项开始播放;而且如果CreateMediaItem的异步操作没全部完成就设置索引,也会导致队列状态异常。
正确的实现方式
这里有两种靠谱的方案,你可以选适合自己的:
方案1:先构建完整队列,设置索引再播放
这种方式更可控,确保所有媒体项都加载完成后再指定起始位置:
// 1. 异步创建所有媒体项,确保全部加载完成 var extractor = CrossMediaManager.Current.MediaExtractor; var mediaItems = new List<IMediaItem> { await extractor.CreateMediaItem(pathA), await extractor.CreateMediaItem(pathB), await extractor.CreateMediaItem(pathC) }; // 2. 清空现有队列并添加新项 CrossMediaManager.Current.MediaQueue.Clear(); foreach (var item in mediaItems) { CrossMediaManager.Current.MediaQueue.Add(item); } // 3. 设置起始播放索引(这里是B,索引为1) CrossMediaManager.Current.MediaQueue.CurrentIndex = 1; // 4. 启动播放 await CrossMediaManager.Current.Play();
方案2:直接用Play重载指定起始项和完整队列
这个方法更简洁,利用MediaManager的内置重载,直接告诉它要播放的项和整个队列:
var mediaPaths = new List<string> { pathA, pathB, pathC }; // 第一个参数是要开始播放的项,第二个是完整队列 await CrossMediaManager.Current.Play(mediaPaths[1], mediaPaths);
这样播放会直接从B开始,队列里包含A、B、C,按上一曲自然就能回到A,完美符合你的需求!
额外注意点
- 确保所有异步操作(比如
CreateMediaItem)都用await等待完成,避免队列还没构建好就操作索引。 - 如果是Android平台,有些设备的MediaController状态需要同步,设置索引后调用
Play()比单独调用Prepare()更可靠。
内容的提问来源于stack exchange,提问作者user5295546
相关产品推荐
相关产品推荐

