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

Xamarin Android:媒体资源存放与MediaPlayer启动方法咨询

我来帮你搞定这两个Xamarin Android MediaPlayer的问题,这些都是我实际开发中踩过的坑,亲测有效的方案:

问题1:媒体文件的存放位置与访问方式

情况一:内置应用资源(raw文件夹)

首先纠正一个拼写错误:是Resources/raw,不是你写的Ressources.raw。正确的操作步骤:

  • 在你的Xamarin Android项目中,创建Resources/raw文件夹(如果没有的话)
  • 将你的test.mp3文件放入这个文件夹
  • 选中文件,在属性面板里把Build Action设置为AndroidResource(这步非常关键,不设置的话系统识别不到资源)

访问的时候不能直接用字符串路径,要通过Android资源ID来获取,也就是Resource.Raw.test,这个ID是系统自动生成的。

情况二:SD卡中的文件

如果要播放SD卡上的mp3,需要先处理权限问题:

  1. 在AndroidManifest.xml中添加读取外部存储的权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  1. 对于Android 6.0(API 23)及以上的系统,还需要动态申请权限(用户手动授权):
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != Permission.Granted)
{
    ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage }, 1);
}

获取SD卡文件路径的正确方式是用系统API:

string sdCardPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
string mp3Path = Path.Combine(sdCardPath, "你的文件夹/test.mp3"); // 替换成你实际的文件路径
问题2:正确启动MediaPlayer的代码

你的代码主要问题是SetDataSource的路径格式错误,而且没有处理异常和资源释放。下面是修正后的完整代码:

protected MediaPlayer player;

public void StartPlayer()
{
    try
    {
        if (player == null)
        {
            player = new MediaPlayer();
            // 方式一:播放raw文件夹中的资源
            var resourceFd = Resources.OpenRawResourceFd(Resource.Raw.test);
            player.SetDataSource(resourceFd.FileDescriptor, resourceFd.StartOffset, resourceFd.Length);
            resourceFd.Close(); // 记得关闭文件描述符

            // 方式二:播放SD卡中的文件(替换上面的代码即可)
            // string mp3Path = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, "Music/test.mp3");
            // player.SetDataSource(mp3Path);

            player.Prepare();
            player.Start();
            text = "Running";
        }
        else
        {
            // 如果当前正在播放,先停止再重置
            if (player.IsPlaying)
            {
                player.Stop();
            }
            player.Reset();
            
            // 重复上面的数据源设置代码
            var resourceFd = Resources.OpenRawResourceFd(Resource.Raw.test);
            player.SetDataSource(resourceFd.FileDescriptor, resourceFd.StartOffset, resourceFd.Length);
            resourceFd.Close();

            player.Prepare();
            player.Start();
        }
    }
    catch (Exception ex)
    {
        // 捕获异常,方便排查问题,比如给用户提示
        text = $"播放失败:{ex.Message}";
    }
}

// 非常重要:在Activity销毁时释放MediaPlayer资源,避免内存泄漏
protected override void OnDestroy()
{
    base.OnDestroy();
    if (player != null)
    {
        player.Release();
        player = null;
    }
}

关键说明:

  • 用OpenRawResourceFd获取raw资源的文件描述符,这是Xamarin中访问内置音频资源的标准方式,直接写字符串路径会找不到文件
  • 添加了异常捕获,播放过程中可能会出现文件不存在、权限不足等问题,捕获异常后能快速定位问题
  • 在OnDestroy中释放MediaPlayer,避免内存泄漏,这是Android开发的最佳实践

内容的提问来源于stack exchange,提问作者GodmasterofDoom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:46:48