我正在寻找一种工作(且AppStore安全)的方法来检测当前音量设置,并在音量级别更改时获得通知/回调。我不想改变音量设置。
所有这些都是在我的ViewController中实现的,在其中使用了所述按钮。我已经测试过iPhone 4运行iOS 4.0.1和4.0.2以及iPhone 3G运行4.0.1。使用iOS SDK 4.0.2构建,使用llvm 1.5。(使用gcc或llvm-gcc没有任何改进。)无论哪种方式实施都没有问题,在构建期间既没有错误也没有警告。静态分析器也很高兴。
到目前为止,以下是我尝试过的所有内容,都没有成功。
根据苹果的音频服务文档,我应该为kAudioSessionProperty_CurrentHardwareOutputVolume注册一个AudioSessionAddPropertyListener,它应该像这样工作:
// Registering for Volume Change notifications
AudioSessionInitialize(NULL, NULL, NULL, NULL);
returnvalue = AudioSessionAddPropertyListener (
kAudioSessionProperty_CurrentHardwareOutputVolume ,
audioVolumeChangeListenerCallback,
self
);
returnvalue
是 0
,这意味着注册回调函数成功。
不幸的是,当我按设备上的音量按钮、耳机按钮或将铃声静音开关翻转时,我的函数 audioVolumeChangeListenerCallback
从未得到回调。
当使用完全相同的代码注册 kAudioSessionProperty_AudioRouteChange
(在 WWDC 视频、开发者文档和许多网站上用作类似的示例项目)时,实际上会在更改音频路由时(通过插入/拔出耳机或将设备插入底座)得到回调。
名为 Doug 的用户发布了一个标题为 iPhone volume changed event for volume already max 的帖子,在那里他声称他成功地使用了这种方式(除非音量实际上已经设置为最大)。但对我来说并没有起作用。
我尝试过的另一种方法是像这样在 NSNotificationCenter
中注册。
// sharedAVSystemController
AudioSessionInitialize(NULL, NULL, NULL, NULL);
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
selector:@selector(volumeChanged:)
name:@"AVSystemController_SystemVolumeDidChangeNotification"
object:nil];
这应该通知我的方法
volumeChanged
有任何SystemVolume
的更改,但实际上并没有这样做。由于普遍的信念告诉我,如果一个人在使用Cocoa时努力实现某些事情,那么他可能正在做一些根本错误的事情,因此我期望在这里漏掉了某些东西。很难相信没有简单的方法来获取当前音量级别,然而我还没有能够找到一个使用苹果的文档、示例代码、谷歌、苹果开发者论坛或通过观看WWDC 2010视频来找到一个。