播放结束后将音量控制返回给 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 设备铃声的主要内容,如果未能解决你的问题,请参考以下文章

iOS使用虚拟AVAudioPlayer从铃声切换到系统音量

铃声音量滑块,快速

覆盖 iPhone 应用程序中的铃声音量

iPhone:如何播放忽略音量和铃声开关设置的声音?

如何以编程方式增加iPhone音量

iOS 以恒定音量播放声音文件,与用户设置无关