在Xamarin.Forms中播放音频遇文件未找到问题求助
Xamarin.Forms Android 音频播放文件找不到问题解决方案
一、先确认文件的生成操作(关键前提)
不管把音频放在res/raw还是assets目录,先检查文件的生成操作:
- 右键Android项目里的
audio.mp3→ 属性 → 生成操作,对应设置:res/raw下的文件:设为AndroidResourceassets下的文件:设为AndroidAsset
二、res/raw 目录的正确播放方式
别硬编码包名,用Context获取资源ID更可靠,避免包名拼写错误:
using Android.Media; using Android.Content; // 获取全局Context(DependencyService实现类里直接用这个即可) var context = Android.App.Application.Context; var player = new MediaPlayer(); // 方式1:通过资源名获取ID(注意不带.mp3后缀) int resId = context.Resources.GetIdentifier("audio", "raw", context.PackageName); player.SetDataSource(context, Android.Net.Uri.Parse($"android.resource://{context.PackageName}/{resId}")); // 方式2:直接引用自动生成的资源ID(更简洁) // player.SetDataSource(context, Resource.Raw.audio); player.Prepare(); player.Start();
三、assets 目录的正确播放方式
用AssetManager打开文件流,再给MediaPlayer设置数据源:
using Android.Media; using Android.Content; var context = Android.App.Application.Context; var player = new MediaPlayer(); // 打开assets中的音频文件流 using (var assetStream = context.Assets.Open("audio.mp3")) { player.SetDataSource(assetStream.Fd); player.Prepare(); player.Start(); }
四、DependencyService 正确实现示例
如果要在Xamarin.Forms共享代码中调用,按以下步骤来:
1. 共享项目定义接口
public interface IAudioPlayer { void PlayAudio(); }
2. Android项目实现类
[assembly: Dependency(typeof(AndroidAudioPlayer))] namespace YourAppNamespace.Droid { public class AndroidAudioPlayer : IAudioPlayer { public void PlayAudio() { var context = Android.App.Application.Context; var player = new MediaPlayer(); try { // 这里用res/raw的方式,也可以替换成assets的写法 player.SetDataSource(context, Resource.Raw.audio); player.Prepare(); player.Start(); // 播放完成后释放资源,避免内存泄漏 player.Completion += (s, e) => { player.Release(); player.Dispose(); }; } catch (Exception ex) { // 打印异常方便排查 System.Diagnostics.Debug.WriteLine($"播放失败:{ex.Message}"); } } } }
3. 共享代码中调用
DependencyService.Get<IAudioPlayer>().PlayAudio();
常见排查点
- 文件名必须全小写、无空格和特殊字符,比如
Audio.mp3要改成audio.mp3 - 确认文件确实存在于对应目录,没有被误删除
- 播放完成后记得调用
Release()和Dispose()释放MediaPlayer资源
内容的提问来源于stack exchange,提问作者yaroslav_ch
相关产品推荐
相关产品推荐

