3

似乎AVSystemController_SystemVolumeDidChangeNotification每次启动 AVCaptureSession 时都会触发 iPhone 5 上的事件。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];

有谁知道如何解决这个问题?我正在使用这个 Observer 用音量按钮拍照(我知道它是一个私有 API,但它与默认相机应用程序的功能相同,Apple 通常视而不见......),但仅在 iPhone 5 上拍照每次相机启动时拍摄。

4

2 回答 2

6

用这个:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(volumeChanged:)
                                             name:@"AVSystemController_SystemVolumeDidChangeNotification"
                                           object:nil];

接着:

- (void)volumeChanged:(NSNotification*)notification
{
    if([[notification.userInfo objectForKey:@"AVSystemController_AudioVolumeChangeReasonNotificationParameter"] isEqualToString:@"ExplicitVolumeChange"])
    {
        float volume = [[[notification userInfo]
                         objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"]
                        floatValue];
    }
}
于 2015-10-16T13:02:11.810 回答
0

抱歉,我无法让它正常工作。我确信 Apple 在 iPhone 5 上采用这种方式是有充分理由的,但它确实令人讨厌。

我发现它的唯一方法是不使用它,而是使用音频会话属性侦听器方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //...
    AudioSessionInitialize(nil, nil, nil, nil);
    AudioSessionSetActive(YES);

    AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume, volumeListenerCallbackIPhone, (__bridge void *)(self));
    //...
}

然后在回调中:

- (void)volumeChanged:(NSNotification *)notification
{
    NSLog(@"volumeChanged");
    // ...
}

...然后根据上下文进一步过滤事件。

-肯

于 2013-07-10T11:33:44.383 回答