Android-медиаплеер SetDataSource (AssetFileDescriptor) не работает ‹API 24

Я использую 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(); }


person Sjors Miltenburg    schedule 29.12.2017    source источник


Ответы (2)


Попробуйте приведенные ниже коды,

_mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(),assetFileDescriptor.getStartOffset(),assetFileDescriptor.getLength());
person abu bakar siddique    schedule 15.10.2019

хм очевидно подпись метода

_mediaPlayer.SetDataSource(assetFileDescriptor); 

был представлен в более позднем API (я не смог найти в документации, что эта подпись метода недействительна в более низких версиях API)

но подпись метода

_mediaPlayer.SetDataSource(assetFileDescriptor.FileDescriptor, assetFileDescriptor.StartOffset, assetFileDescriptor.Length);

кажется, работает ‹API24

person Sjors Miltenburg    schedule 29.12.2017