播放结束后将音量控制返回给 iOS 设备铃声
Posted
技术标签:
【中文标题】播放结束后将音量控制返回给 iOS 设备铃声【英文标题】:Return volume control to iOS device ringer after playback ends 【发布时间】:2012-01-02 10:44:24 【问题描述】:我有一个音频应用程序,它使用媒体播放音频会话类别来允许背景音频。一旦我的音频会话被初始化,ios 设备上的硬件音量按钮就会控制我的音频会话的音量。
一旦音频播放停止,我想将电话铃声的控制权返回给硬件音量按钮,但我尝试通过停用音频会话来做到这一点并没有成功。
这是我初始化和激活音频会话的方式:
AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, self);
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
self);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory);
以下是我尝试停用音频会话并将 iOS 设备振铃器的控制权返回给硬件音量控制的方法:
AudioSessionSetActive(false);
据我所知,至少有一个应用程序会以这种方式运行(Audible.com 的 iOS 应用程序)。有谁知道我可能做错了什么?
【问题讨论】:
您是否尝试将类别设置回环境? 我尝试将类别设置为除媒体播放之外的所有内容,但没有成功。 有趣,让我提醒你玩 iOS 音频需要非常小心的错误处理。AudioSessionSetActive(false);
返回的 OSStatus
是什么? developer.apple.com/library/ios/#DOCUMENTATION/AudioToolbox/…
AudioSessionSetActive(false)返回的OSStatus是560030580,我认为是kAudioSessionNotActiveError('!act'),意思是“音频操作失败,因为你的应用程序的音频会话没有激活”。但是,此时使用音量控件仍可控制音频音量,而不是设备的铃声音量。
【参考方案1】:
在苹果文档中,我认为您将不得不实际删除侦听器。
向上看: AudioSessionRemovePropertyListenerWithUserData
http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html
【讨论】:
我通过调用以下命令尝试了这一点,但没有成功:AudioSessionRemovePropertyListenerWithUserData(kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, self);【参考方案2】:我刚遇到这个问题,但我正在使用 AVAudioPlayer。如果我试图在调用 play 后立即停用我的会话,它不起作用。但是等待 audioPlayerDidFinishPlaying:successfully: 然后执行此操作:
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *error;
BOOL wasSuccessful = [audioSession setActive:NO error:&error];
NSLog(@"wasSuccessful: %@", wasSuccessful ? @"Yes" : @"No");
我正在使用默认音频会话,顺便说一句。
【讨论】:
以上是关于播放结束后将音量控制返回给 iOS 设备铃声的主要内容,如果未能解决你的问题,请参考以下文章