AVAudioSessionInterruptionNotification not called

问题描述:

监听了系统的打断事件,在来电的时候有收到系统打断的 AVAudioSessionInterruptionTypeBegan 通知,却没有收到 AVAudioSessionInterruptionTypeEnd 通知。

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive:YES error: nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruptionNotificationHandler:) name:AVAudioSessionInterruptionNotification object:nil];


解决问题步骤

Google 搜索了好些答案:

iOS AVAudioSession Interruption Notification not working as expected 

AVAudioSession interruptions

Handling interruptions during a phone call - the "begin" works but the "end" doesn't

Audio Session Programming Guide

然而,都没能解决问题。

后来自己 debug 发现,在 applicationWillResignActive: 或者是 applicationDidBecomeActive: 方法里面设置了

   NSError *error = nil;
   BOOL issuccess = [[AVAudioSession sharedInstance] setActive:YES error:&error];
    NSLog(@"is setactive success: %d",issuccess);
    if (error) {
        NSLog(@"error:%@",error.description);
    }

这个之后就收不到系统发出的 AVAudioSessionInterruptionTypeEnd 通知了。


解决方法:

不要在 applicationWillResignActive: 或者是 applicationDidBecomeActive: 方法里面 active AVAudiosession 。

原因:

接到来电的时候,系统会占用 AVAudiosession ,这时候你的应用就收到了 AVAudioSessionInterruptionTypeBegan 的通知了,然后进入了 applicationWillResignActive 以响应来电,如果此时你 active 了 audiosession ,你的应用就会重新拥用 audiosession 的所有权,既然你已经拥有了 audiosession 就不再会收到 interruption end 的通知了。

这里有一个疑问:响应来电的优先级应该比你应用的优先级要高的,此时你设置

BOOL issuccess = [[AVAudioSession sharedInstance] setActive:NO error:&error];

正常情况下应该返回的是 false 才对,苹果的文档上也是这么说的,而事实上它返回的是 true,意味着你的应用抢占 audiosession 所有权成功,这就很奇怪了。

文档:setActive:error:


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值