我已经阅读了很多关于这个主题的帖子,但答案并非100%明确。我在这里寻求清晰。
我的应用会定期播放短AVAudioPlayer声音。问题是,我只能在播放第一个声音后设置音量。
在阅读stackoverflow之后,每个人似乎都建议我在应用程序启动时播放一个虚拟(静音)AVAudioPlayer声音,将设备的音量按钮“链接”到“app volume”。
换句话说,当应用程序启动时,它是默认控制的“Ringer”音量,只有在播放第一个声音后,设备的音量按钮才会最终控制“app volume”(AVAudioPlayer音量)(这是图像没有任何标签)。不幸的是,当这种情况发生时,用户听不到第一个声音,现在看到应用程序已损坏。
我的问题是,这是答案吗?我是否只是在应用程序启动时播放一个简短的虚拟声音,以将设备的音量按钮“链接”到应用程序?
答案 0 :(得分: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。
答案 1 :(得分:1)
嘿,对于未来的答案搜索者,由于iOS7中不推荐AudioSessionInitialize
和AudioSessionSetActive
,因此处理硬件音频和获取回叫的推荐方法是使用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];
}