gpt4 book ai didi

ios - 如何在 iOS 上获取音量级别和音量更改通知?

转载 作者:IT王子 更新时间:2023-10-29 07:35:01 25 4
gpt4 key购买 nike

我正在编写一个非常简单的应用程序,它在按下按钮时播放声音。由于当设备设置为静音时该按钮没有多大意义,我想在设备的音量为零时禁用它。 (并随后在再次调高音量时重新启用它。)

我正在寻找一种可行的(和 AppStore 安全的)方法来检测当前音量设置并在音量级别发生变化时获得通知/回调。我不想改变音量设置。

所有这些都在我的 ViewController 中实现,其中使用了所述按钮。我已经用运行 iOS 4.0.1 和 4.0.2 的 iPhone 4 以及运行 4.0.1 的 iPhone 3G 对此进行了测试。使用带有 llvm 1.5 的 iOS SDK 4.0.2 构建。 (使用 gcc 或 llvm-gcc 不会改进任何东西。)无论哪种方式,在构建过程中都没有问题,既没有错误也没有警告。静态分析器也很高兴。

这是我到目前为止尝试过的方法,但都没有成功。

按照 Apple 的音频服务文档,我应该为 kAudioSessionProperty_CurrentHardwareOutputVolume 注册一个 AudioSessionAddPropertyListener,它应该像这样工作:

// Registering for Volume Change notifications
AudioSessionInitialize(NULL, NULL, NULL, NULL);
returnvalue = AudioSessionAddPropertyListener (

kAudioSessionProperty_CurrentHardwareOutputVolume ,
audioVolumeChangeListenerCallback,
self
);

returnvalue0,这意味着注册回调有效。

遗憾的是,当我按下设备上的音量按钮、耳机答题器或拨动铃声静音开关时,我的函数 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 实现某件事而工作太过努力,那么他就是在做一些根本性的错误,我希望在这里能漏掉一些东西。很难相信没有简单的方法获取当前的音量水平,但我一直无法使用 Apple 的文档、示例代码、谷歌找到一个, Apple 开发者论坛或观看 WWDC 2010 视频。

最佳答案

您是否有可能为 volumeChanged: 方法签名错误?这对我有用,转储在我的 appdelegate 中:

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(volumeChanged:)
name:@"AVSystemController_SystemVolumeDidChangeNotification"
object:nil];
}

- (void)volumeChanged:(NSNotification *)notification
{
float volume =
[[[notification userInfo]
objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"]
floatValue];

// Do stuff with volume
}

每次按下按钮时,我的 volumeChanged: 方法都会被触发,即使音量没有因此改变(因为它已经处于最大/最小值)。

关于ios - 如何在 iOS 上获取音量级别和音量更改通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3651252/

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