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

Xamarin UWP使用SimpleAudioPlayer播放音频崩溃问题求助

解决Xamarin UWP中SimpleAudioPlayer加载音频失败的问题

核心问题分析

  1. 资源加载方式不匹配:你用Assembly.GetManifestResourceStream读取的是Embedded Resource类型资源,但音频文件的Build Action设为了Content,两种资源的读取逻辑完全不同,导致返回null触发空引用异常。
  2. UWP路径格式错误:直接调用Load时,未使用UWP专属的Content文件路径前缀,插件无法定位文件,引发COM异常。
  3. 跨平台代码隔离问题:通用C#文件不能直接引用UWP专属API(如MediaPlayer、Storage相关类),必须通过平台适配实现功能。

解决方案

方案1:修正直接加载的路径(最简方案)

给文件路径加上UWP专属的ms-appx:///前缀,确保插件能定位到Content类型的音频文件:

var audio = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current;
// 前缀+文件夹+文件名,确保文件Build Action为Content、Copy to Output设为Copy if newer
audio.Load("ms-appx:///Assets/beep-09.mp3");
audio.Play();

方案2:正确读取Content文件流(需流操作场景)

通过依赖服务实现平台专属的流读取,避免通用代码直接调用UWP API:

  1. 在共享项目定义接口:
public interface IAudioStreamService
{
    Task<Stream> GetAudioStreamAsync(string filename);
}
  1. 在UWP项目实现接口:
[assembly: Dependency(typeof(AudioStreamService))]
namespace YourAppNamespace.UWP
{
    public class AudioStreamService : IAudioStreamService
    {
        public async Task<Stream> GetAudioStreamAsync(string filename)
        {
            var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(
                new Uri($"ms-appx:///Assets/{filename}")
            );
            return await file.OpenStreamForReadAsync();
        }
    }
}
  1. 在共享项目代码中调用:
private async void AddOrUpdateData()
{
    InvokeOnMainThread(async () => {
        // ... 原有逻辑 ...
        default:
            try
            {
                // ... 原有逻辑 ...
            }
            finally
            {
                if (my_value < 20)
                {
                    var streamService = DependencyService.Get<IAudioStreamService>();
                    var stream = await streamService.GetAudioStreamAsync("beep-09.mp3");
                    var audio = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current;
                    audio.Load(stream);
                    audio.Play();
                }
                // ... 原有逻辑 ...
            }
        // ... 原有逻辑 ...
    });
}

方案3:改用Embedded Resource(修改Build Action)

若将音频文件的Build Action改为Embedded Resource,需用「项目命名空间+文件夹+文件名」的格式读取:

Stream GetStreamFromFile(string filename)
{
    var assembly = typeof(Application).GetTypeInfo().Assembly;
    // 替换成你的项目实际命名空间
    var resourceFullName = $"YourAppNamespace.Assets.{filename}";
    return assembly.GetManifestResourceStream(resourceFullName);
}

可通过assembly.GetManifestResourceNames()输出所有资源名,确认正确的资源路径。


额外注意事项

  • 确认Xam.Plugin.SimpleAudioPlayer 1.6.0与UWP目标版本10.0.19041.0兼容,若有问题可尝试升级至最新稳定版。
  • 检查Package.appxmanifest中是否添加了音频相关权限(部分场景下权限缺失会触发COM异常)。
  • 保持音频播放逻辑在UI线程执行(你已用InvokeOnMainThread,此部分无需调整)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 03:45:53