android mediaplayer SetDataSource(AssetFileDescriptor)不工作<;API 24

android mediaplayer SetDataSource(AssetFileDescriptor)不工作<;API 24,android,xamarin.forms,android-mediaplayer,media-player,Android,Xamarin.forms,Android Mediaplayer,Media Player,我使用的是Xamarin.Forms,在我的android项目中,我有一个自定义的AudioManager类来播放音频文件 我有一段代码,可以用Android.Media.MediaPlayer类播放资产目录中的嵌入式音频文件 此代码在具有API24及以上版本的设备上运行良好。 但它会在mediaplayer.SetDataSource(assetFileDescriptor)上为API为23及更低版本的设备生成一个异常 异常显示为“Java.Lang.NoSuchMethodError:无非静

我使用的是Xamarin.Forms,在我的android项目中,我有一个自定义的AudioManager类来播放音频文件

我有一段代码,可以用Android.Media.MediaPlayer类播放资产目录中的嵌入式音频文件

此代码在具有API24及以上版本的设备上运行良好。 但它会在mediaplayer.SetDataSource(assetFileDescriptor)上为API为23及更低版本的设备生成一个异常

异常显示为“Java.Lang.NoSuchMethodError:无非静态方法”Landroid/media/MediaPlayer;。setDataSource(Landroid/content/res/AssetFileDescriptor;)”

这是一个已知的问题吗?如果是,你如何解决这个问题

我的代码:


public void播放嵌入的声音(字符串soundFileName)
{
if(_mediaPlayer!=null&&u mediaPlayer.IsPlaying)
{
_mediaPlayer?.Stop();
}
_mediaPlayer?.Reset();
_mediaPlayer?.Release();
_mediaPlayer=新的mediaPlayer();
if(Android.OS.Build.VERSION.SdkInt>Android.OS.BuildVersionCodes.Lollipop)
{
//不支持@API16
var attributes=newaudioattributes.Builder()
.SetUsage(AudioUsageKind.VoiceCommunication)
.SetContentType(AudioContentType.Speech)
.SetFlags(AudioFlags.AudibilityEnforced)
.Build();
_mediaPlayer.SetAudioAttributes(属性);
}
_mediaPlayer.SetVolume(1F,1F);
var assetsoundsdir=“声音”;
var soundPath=System.IO.Path.Combine(assetsoundsdir,soundFileName);
var资产文件描述符=
Android.App.Application.Context.Assets.OpenFd(soundPath);
_mediaPlayer.Prepare();
_mediaPlayer.Completion-=\u mediaPlayer\u Completion;
_mediaPlayer.Completion+=\u mediaPlayer\u Completion;
_mediaPlayer.Start();
}

方法签名

_mediaPlayer.SetDataSource(assetFileDescriptor); 
是在后来的API中引入的,(我在文档中找不到此方法签名在较低的API版本中无效)

但是方法签名

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

方法签名似乎有效hmm

_mediaPlayer.SetDataSource(assetFileDescriptor); 
是在后来的API中引入的,(我在文档中找不到此方法签名在较低的API版本中无效)

但是方法签名

_mediaPlayer.SetDataSource(assetFileDescriptor.FileDescriptor, assetFileDescriptor.StartOffset, assetFileDescriptor.Length);
似乎工作正常请尝试以下代码

_mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(),assetFileDescriptor.getStartOffset(),assetFileDescriptor.getLength());
试试下面的代码

_mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(),assetFileDescriptor.getStartOffset(),assetFileDescriptor.getLength());