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

在Xamarin.Forms中播放音频遇文件未找到问题求助

Xamarin.Forms Android 音频播放文件找不到问题解决方案

一、先确认文件的生成操作(关键前提)

不管把音频放在res/raw还是assets目录,先检查文件的生成操作:

  • 右键Android项目里的audio.mp3 → 属性 → 生成操作,对应设置:
    • res/raw下的文件:设为AndroidResource
    • assets下的文件:设为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:52:14