gpt4 book ai didi

ios - 在 iOS 设备上检测事件的 AVAudioSession

转载 作者:IT王子 更新时间:2023-10-29 07:53:31 30 4
gpt4 key购买 nike

我正在尝试弄清楚这是否可行 - 我的应用激活了一个初始化为以下内容的 Audio Session :

[[[AVAudioSession alloc] init] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&error];

我希望能够了解何时播放源自其他应用或操作系统的附加 Audio Session 。

我知道实现委托(delegate)方法 beginInterruption:endInterruption 的能力,但由于 AVAudioSessionCategoryOptionMixWithOthers 选项,这些不会被调用我正在使用。

有没有不使用私有(private) API 就可以实现的方法?

提前致谢。

最佳答案

iOS 6.0 以来,您管理应用程序 Audio Session 的方式发生了一些重大变化,值得首先简要提及。在 iOS 6.0 之前,您将使用 AVAudioSessionAudioSessionServices 类,分别合并委托(delegate)和属性监听。从 iOS 6.0 开始使用 AVAudioSession 类并合并通知。

以下内容适用于 iOS 6.0 以上版本。

要判断您的应用程序沙箱之外的其他音频是否正在播放,请使用 -

// query if other audio is playing
BOOL isPlayingWithOthers = [[AVAudioSession sharedInstance] isOtherAudioPlaying];
// test it with...
(isPlayingWithOthers) ? NSLog(@"other audio is playing") : NSLog(@"no other audio is playing");

至于中断处理,您需要观察 AVAudioSessionInterruptionNotificationAVAudioSessionRouteChangeNotification。因此,在管理 Audio Session 的类中,您可以放置​​如下内容 - 这应该在应用程序生命周期开始时调用一次,并且不要忘记在同一类的 dealloc 方法中删除观察者。

// ensure we already have a singleton object
[AVAudioSession sharedInstance];
// register for notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(interruption:)
name:AVAudioSessionInterruptionNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(routeChange:)
name:AVAudioSessionRouteChangeNotification
object:nil];

最后添加以下选择器 interruption:routeChange: - 它们将接收一个 NSNotification 对象,该对象具有名为 userInfo 类型的属性您阅读的 NSDictionary 可帮助您的应用程序具有任何条件。

- (void)interruption:(NSNotification*)notification {
// get the user info dictionary
NSDictionary *interuptionDict = notification.userInfo;
// get the AVAudioSessionInterruptionTypeKey enum from the dictionary
NSInteger interuptionType = [[interuptionDict valueForKey:AVAudioSessionInterruptionTypeKey] integerValue];
// decide what to do based on interruption type here...
switch (interuptionType) {
case AVAudioSessionInterruptionTypeBegan:
NSLog(@"Audio Session Interruption case started.");
// fork to handling method here...
// EG:[self handleInterruptionStarted];
break;

case AVAudioSessionInterruptionTypeEnded:
NSLog(@"Audio Session Interruption case ended.");
// fork to handling method here...
// EG:[self handleInterruptionEnded];
break;

default:
NSLog(@"Audio Session Interruption Notification case default.");
break;
} }

同样...

- (void)routeChange:(NSNotification*)notification {

NSDictionary *interuptionDict = notification.userInfo;

NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];

switch (routeChangeReason) {
case AVAudioSessionRouteChangeReasonUnknown:
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonUnknown");
break;

case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
// a headset was added or removed
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonNewDeviceAvailable");
break;

case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
// a headset was added or removed
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonOldDeviceUnavailable");
break;

case AVAudioSessionRouteChangeReasonCategoryChange:
// called at start - also when other audio wants to play
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonCategoryChange");//AVAudioSessionRouteChangeReasonCategoryChange
break;

case AVAudioSessionRouteChangeReasonOverride:
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonOverride");
break;

case AVAudioSessionRouteChangeReasonWakeFromSleep:
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonWakeFromSleep");
break;

case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory:
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory");
break;

default:
break;
} }

只要您在应用程序生命周期开始时检查应用程序 Audio Session 的状态,例如在 Root View Controller 的 viewDidLoad 中,就不需要轮询任何内容。从那里开始到您的应用程序 Audio Session 的任何更改都将通过这两个主要通知获知。根据开关中包含的情况,将 NSLog 语句替换为您的代码需要执行的操作。

您可以在 AVAudioSession 类引用文档中找到有关 AVAudioSessionInterruptionTypeKeyAVAudioSessionRouteChangeReasonKey 的更多信息。

对于冗长的回答,我深表歉意,但我认为 iOS 中的 Audio Session 管理相当繁琐,并且在撰写本文时,Apple 的 Audio Session 编程指南不包括使用通知进行中断处理的代码示例。

关于ios - 在 iOS 设备上检测事件的 AVAudioSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20371388/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com