android - xamarin.forms android mediaplayer SetDataSource(AssetFileDescriptor) 不支持 <API 24

  显示原文与译文双语对照的内容
139 3

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

我拥有从 assets 目录中使用 Android.Media.MediaPlayer 类播放嵌入式audiofile的代码。

这里代码在API24和上设备上工作正常。但是它会在 mediaplayer.SetDataSource(assetFileDescriptor) 上为具有 23和更低的API的设备生成一个异常。

异常读取"nosuchmethoderror 。lang: 无静态方法"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(); }

时间:原作者:0个回答

98 4

嗯显然方法签名

_mediaPlayer.SetDataSource(assetFileDescriptor); 

在后来的API中引入( 我无法在文档中找到这里方法签名在较低的API版本中无效)

但是方法签名

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

似乎在 <API24工作

原作者:
...