从Xamarin的Resources文件夹中播放后台服务中的音频文件

时间:2017-08-10 12:37:36

标签: c# android xamarin

我试图让我的音频应用程序播放我放在Resources文件夹中的音频文件。我以此为指导。

https://developer.xamarin.com/guides/android/application_fundamentals/working_with_audio/

我正在尝试在我的项目中播放一个在Resources / Raw中的mp3。

我在第33行得到了这个未处理的例外

Unhandled Exception:

Java.IO.IOException: setDataSource failed. occurred

以下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Media;
using Android.Content.Res;


namespace AudioTour
{
    [Service(Exported = false, Name = "com.AudioTour.AudioService")]
    public class AudioService : Service
    {
        private MediaPlayer player;

        public override void OnCreate()
        {
            Console.WriteLine("Audio Service background task created");           
            StartPlayer();
        }

        public void StartPlayer()
        {
                player = new MediaPlayer();
                player.Reset();
                player.SetDataSource("/Resource/Raw/Test.mp3"); // Unhandled Exception is triggered here
                player.Prepare();
                player.Start();
        }

        public override IBinder OnBind(Intent intent)
        {
            return null;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我相信您的问题是字符串参数要求它是"android.resource://" + PackageName + "/Raw/Test.mp3"的完整路径尽管如此 我建议将描述符传入你的播放器。

public void StartPlayer()
{
    try
    {
        var player = new MediaPlayer();
        var descriptor = _context.Assets.OpenFd("Test.mp3");

        player.SetDataSource(descriptor.FileDescriptor, descriptor.StartOffset, descriptor.Length);
        descriptor.Close();

        player.Prepare();
        player.Start();
    }
    catch ()
    {
    }
}     

请注意,此示例的声音文件实际上位于根Android Assets文件夹中,而不在资源中。