Я использую Xamarin.Forms, где в моем проекте Android у меня есть собственный класс AudioManager для воспроизведения аудиофайлов.
У меня есть код, который воспроизводит встроенный аудиофайл из каталога ресурсов с классом Android.Media.MediaPlayer.
Этот код отлично работает на устройствах с API24 и выше. Но он генерирует исключение в медиаплеере.SetDataSource (assetFileDescriptor) для устройств с API 23 и ниже.
Исключение гласит: «Java.Lang.NoSuchMethodError: нет нестатического метода» Landroid / media / MediaPlayer; .setDataSource (Landroid / content / res / AssetFileDescriptor;) »
Это известная проблема? и если да, то как это можно обойти.
мой код:
public void PlayEmbeddedSound(string soundFileName)
{
if (_mediaPlayer != null && _mediaPlayer.IsPlaying)
{
_mediaPlayer?.Stop();
}
_mediaPlayer?.Reset();
_mediaPlayer?.Release();
_mediaPlayer = new MediaPlayer();
if (Android.OS.Build.VERSION.SdkInt > Android.OS.BuildVersionCodes.Lollipop)
{
//not supported @ API16
var attributes = new AudioAttributes.Builder()
.SetUsage(AudioUsageKind.VoiceCommunication)
.SetContentType(AudioContentType.Speech)
.SetFlags(AudioFlags.AudibilityEnforced)
.Build();
_mediaPlayer.SetAudioAttributes(attributes);
}
_mediaPlayer.SetVolume(1F, 1F);
var assetsSoundsDir = "Sounds";
var soundPath = System.IO.Path.Combine(assetsSoundsDir,soundFileName);
var assetFileDescriptor =
Android.App.Application.Context.Assets.OpenFd(soundPath);
_mediaPlayer.Prepare();
_mediaPlayer.Completion -= _mediaPlayer_Completion;
_mediaPlayer.Completion += _mediaPlayer_Completion;
_mediaPlayer.Start();
}