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,需要先处理权限问题:
- 在
AndroidManifest.xml中添加读取外部存储的权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- 对于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
相关产品推荐
相关产品推荐

