Jim
Jim

Reputation: 801

Play Audio File in Background Service from Resources folder in Xamarin

I'm trying to get my audio application to play an audio file I have put in the Resources folder. I'm using this as a guide.

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

I am trying to play an mp3 which is in Resources/Raw within my project.

I get this Unhandled Exception on line 33

Unhandled Exception:

Java.IO.IOException: setDataSource failed. occurred

of the below code

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;
        }
    }
}

Upvotes: 0

Views: 906

Answers (1)

Nick Peppers
Nick Peppers

Reputation: 3251

I believe your issue is the string parameter requires it to be the full path of "android.resource://" + PackageName + "/Raw/Test.mp3" Although, I would suggest passing in a descriptor into your player instead.

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 ()
    {
    }
}     

Note that the sound file for this example is actually in a root Android Assets folder and not in resources.

Upvotes: 2

Related Questions