大部分静音 iOS 应用程序中的音量控制
Posted
技术标签:
【中文标题】大部分静音 iOS 应用程序中的音量控制【英文标题】:Volume Control in a mostly Silent iOS app 【发布时间】:2012-03-20 18:28:13 【问题描述】:我之前问过this question,但我觉得我应该开始一个新线程,因为我的另一个线程已经过时并且可能措辞不佳。我想知道为 ios 应用程序添加音量控制的最佳方法是什么,大多数情况下是无声的。一个很好的例子是一个导航应用程序,它只在您接近或错过转弯时播放音频。在这样的应用程序中,听到不够响亮的转向提示时,用户会希望听到提示的音量,并且自然会使用侧面音量控制来根据自己的喜好调整提示。
这里有几个问题。一个是当前没有播放音频,因此用户无法知道它增加了多少。这或多或少是意料之中的,但是我更感兴趣的是技术问题。要将侧面音量控制链接到您的应用程序,您必须启动和管理音频会话。对于这种情况,我没有找到权威参考,因为大多数文档都假设您当前正在播放或正在启动音频。为一个几乎没有声音的应用管理音频会话似乎是一种边缘情况,尽管我发现它相当普遍,因为我开发的两个主要应用都需要这样的功能。
在与音频会话管理相关的各种问题中,您必须在进出后台时解决终止和恢复音频会话的问题。在开始和停止会话时,您必须考虑其他应用程序正在播放音频。根据您的应用程序类型,您可能还有其他更高级的需求,例如到扬声器的自定义覆盖路由、自定义静音控制等。如果您对此类应用程序有任何经验,您能否详细说明您如何应对这些挑战并阐述其他问题?
【问题讨论】:
你看过iOS文档吗?这种行为在人机交互指南中有很好的定义,甚至还包括实施示例。 你的问题对于这种问答形式来说似乎有点过于宽泛,即使是在主题上。 【参考方案1】:一个非常常见的方法是在启动时设置适合应用类型的音频会话类别,无论声音是内在的还是明天才会播放(只要应用的目的和设置是玩这样)。
添加:
允许用户在应用处于静音状态时调整音量的一种方法是为用户提供一些方法,让您的应用立即开始(和/或可能停止)播放具有应用典型振幅的声音:例如一些校准音/谈话、您的版权声明、商标叮当声或安全信息。
【讨论】:
您将音频会话与音频类别混淆了。您为应用程序的分类设置类别(例如 VOIP、导航等)。Apple 建议您通常在希望播放音频之前开始会话,这突出了我如何允许用户在何时控制音量的总体问题没有什么在播放吗?【参考方案2】:我在开发大多数静音的应用程序时看到的主要问题是移入/移出前台并与其他音频很好地播放。为了更好地了解我通常做什么,我将从最近的一个项目中给出一些 sn-ps。 (这些是故意不完整的,只是为了说明一点。)为了论证,我们假设我们有一个负责维护音频会话的 AudioManager 类。这个类是我们用来实例化我们的自定义音频播放器的。在这样一个类中我们放了:
@interface MyAudioManager ()
@property (nonatomic, retain) BOOL alwaysMaintainAudioSession;
@property (nonatomic, retain) MyCustomAudioPlayer *player;
@end
@implementation MyAudioManager
@synthesize alwaysMaintainAudioSession;
@synthesize player;
-(void) applicationWillEnterForeground
isInBackground = NO;
if (NO==[self anyAudioIsPlaying] && self.alwaysMaintainAudioSession)
[self activateAudioSession];
-(void) activateAudioSession
AudioSessionSetActive(TRUE);
AudioSessionAddPropertyListener ( kAudioSessionProperty_AudioRouteChange, AudioPropertyListener, self);
-(BOOL) anyAudioIsPlaying
return [self otherAudioIsPlaying] || [player isPlaying];
-(BOOL) otherAudioIsPlaying
UInt32 yesNo;
UInt32 propertySize = sizeof(yesNo);
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &yesNo);
if (kAudioSessionUnsupportedPropertyError == status)
return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState];
else
return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState] || yesNo;
管理器允许您设置一个属性,该属性始终保持音量控制与应用声音相关联,这意味着我们始终确保会话处于活动状态或其他应用正在播放音频。在任何其他情况下,音量控制将恢复为控制振铃器。因此,当进入前台时,我们必须检查是否有其他音频正在播放并有条件地激活音频会话。我们还需要在移动到后台时关闭会话以恢复铃声音量控制。
-(void) applicationDidEnterBackground
if (NO==[self anyAudioIsPlaying])
AudioSessionSetActive(NO);
在我的解决方案中,我包含了许多其他代码来处理诸如在连接蓝牙音频设备时智能响应、创建自定义播放器的工厂方法、自定义音频压缩等等。然而,主要思想是处理其他应用程序播放音频,同时尝试在前台保持音量控制与应用程序音量相关联。
【讨论】:
以上是关于大部分静音 iOS 应用程序中的音量控制的主要内容,如果未能解决你的问题,请参考以下文章
flex mobile 4.5 或 phone gap 中 ios 的音量控制