3

我已经阅读了很多关于这个主题的帖子,但答案并不是 100% 清楚。我在这里寻求清晰。

我的应用程序会定期播放简短的 AVAudioPlayer 声音。问题是,我只能在播放第一个声音后设置音量。

在阅读stackoverflow之后,每个人似乎都建议我在应用程序开始时播放一个虚拟(静音)AVAudioPlayer声音,以将设备的音量按钮“链接”到“应用程序音量”。

换句话说,当应用程序启动时,默认控制的是“铃声”音量,只有在播放第一个声音之后,设备的音量按钮才会最终控制“应用程序音量”(AVAudioPlayer音量)(它是没有任何图像的图像标签)。不幸的是,当这种情况发生时,用户没有听到第一个声音,现在看到应用程序已损坏。

我的问题是,这是答案吗?我是否只是在应用程序启动时播放一个简短的虚拟声音以将设备的音量按钮“链接”到应用程序?

参考图像

4

2 回答 2

4

您不必播放虚拟声音。使用 AudioToolbox 框架,您可以按如下方式设置 AudioSessionActive:

AudioSessionInitialize (NULL, NULL, NULL, NULL);
UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);
AudioSessionSetActive (true);

这将允许音量按钮控制应用音量。

有关此方法的更多信息,请参阅此问题:Cannot Control Volume of AVAudioPlayer via Hardware Buttons when AudioSessionActive is NO

于 2013-08-30T21:42:40.497 回答
1

嘿,对于未来的答案搜索者,由于AudioSessionInitializeAudioSessionSetActive在 iOS7 中已弃用,推荐的处理硬件音频和获取回调的方法是使用AVAudioSession对象。@"outputVolume"在会话的属性上将会话设置为您的应用和 KVO 的活动。

- (id)init
{
    self = [super init];
    if (self)
    {

       self.audioSession = [AVAudioSession sharedInstance];
       [_audioSession setActive:YES error:nil];
       [_audioSession addObserver:self forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew  context:NULL];
    }
    return self;   
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"outputVolume"])
    {
        [self setVolume:[change[@"new"] floatValue]];
    }
}

- (void)dealloc
{
    [_audioSession removeObserver:self forKeyPath:@"outputVolume"];
    [_audioSession setActive:NO error:nil];
}
于 2014-03-06T17:41:05.090 回答