我需要快速播放很多短声音,并为每个声音使用单独的
AVAudioPlayer
。我在这里使用C#
,因为我使用.Net MAUI
,但这并不重要。一切都像在原生 iOS 上一样运行。
预加载声音。 AVAudioPlayer
对象被存储以供以后使用(它不会被垃圾回收,因为它存储在只要应用程序运行时就处于活动状态的单例中)。
var player = new AVAudioPlayer(url, null, out _);
player.PrepareToPlay();
我不需要在后台播放它们,因此会话的初始化如下所示
AVAudioSession.SharedInstance().SetCategory(AVAudioSessionCategory.Playback);
AVAudioSession.SharedInstance().SetActive(true);
播放声音
audioPlayer.Play();
它工作正常,但是当我锁定屏幕并解锁它然后调用
Play()
时,它从 Play()
返回 false 并且不播放任何声音。有没有办法获取有关阻止播放的问题的错误消息?
audioPlayer.Play(); // Returns false
我尝试通过设置类别再次初始化会话,但这并不能解决问题。
重新创建
AVAudioPlayer
解决了问题,但这不是一个好的解决方案,因为我想在用户点击按钮播放声音之前解决问题。
我还没有找到任何方法可以提前知道返回应用程序后播放声音是否损坏。因为很多时候即使在锁定/解锁后它也能正常工作。在每个用户返回前台时重新加载所有声音(在我的例子中为 88 个)并不是一个好主意,因为播放声音不是应用程序的核心功能。
有什么想法如何正确修复它吗?
重新创建 AVAudioPlayer 可以解决问题,但这不是一个好的解决方案,因为我想在用户点击按钮播放声音之前解决问题。
根据iOS生命周期事件,您可以重写
WillEnterForeground
方法,
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
public override void WillEnterForeground(UIApplication application)
{
//Console.WriteLine("App entering background state.");
//You may active or initialize the session here
}
public override void DidEnterBackground(UIApplication application)
{
// When the screen is locked, this method is invoked
Console.WriteLine("App entering background state.");
}
希望有帮助! }