我必须创建一个应用程序,其中iPhone在按钮按下事件时保持沉默。
你怎么能以编程方式做到这一点?
答案 0 :(得分:6)
官方iOS SDK中没有任何内容可以执行此操作。想象一下有人错过了一个重要的电话,因为应用程序更改了设置,并且在用户不知情的情况下使手机静音我不想肯定下载该应用程序。请参阅this相关问题。
来自Apple的文档
人,而不是应用程序,应该启动和控制操作。 虽然申请可以提出行动或警告 危险的后果,应用程序通常是一个错误 决策远离用户。最好的应用程序找到正确的 在为人们提供帮助时所需的能力之间取得平衡 他们避免危险的结果。
如果我没有弄错的话,打电话保持沉默就是这种行为。
阅读apple documentation的声音部分。
访问apple developer forum(您必须登录),并查看this主题。在那里回答的人是一名苹果员工。
答案 1 :(得分:2)
// "Ambient" makes it respect the mute switch
// Must call this once to init session
if (!gAudioSessionInited)
{
AudioSessionInterruptionListener inInterruptionListener = NULL;
OSStatus error;
if ((error = AudioSessionInitialize (NULL, NULL, inInterruptionListener, NULL)))
{
NSLog(@"*** Error *** error in AudioSessionInitialize: %d.", error);
}
else
{
gAudioSessionInited = YES;
}
}
SInt32 ambient = kAudioSessionCategory_AmbientSound;
if (AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (ambient), &ambient))
{
NSLog(@"*** Error *** could not set Session property to ambient.");
}
希望这会对你有帮助......
答案 2 :(得分:1)
-(BOOL)muteSwitchEnabled {
#if TARGET_IPHONE_SIMULATOR
// set to NO in simulator. Code causes crashes for some reason.
return NO;
#endif
// go back to Ambient to detect the switch
AVAudioSession* sharedSession = [AVAudioSession sharedInstance];
[sharedSession setCategory:AVAudioSessionCategoryAmbient error:nil];
CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
BOOL muteSwitch = (CFStringGetLength(state) <= 0);
NSLog(@"Mute switch: %d",muteSwitch);
// code below here is just restoring my own audio state, YMMV
_hasMicrophone = [sharedSession inputIsAvailable];
NSError* setCategoryError = nil;
if (_hasMicrophone) {
[sharedSession setCategory: AVAudioSessionCategoryPlayAndRecord error: &setCategoryError];
// By default PlayAndRecord plays out over the internal speaker. We want the external speakers, thanks.
UInt32 ASRoute = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,
sizeof (ASRoute),
&ASRoute
);
}
else
// Devices with no mike don't support PlayAndRecord - we don't get playback, so use just playback as we don't have a microphone anyway
[sharedSession setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];
if (setCategoryError)
NSLog(@"Error setting audio category! %@", setCategoryError);
return muteSwitch;
}
首先切换到环境,读取开关,然后返回设置...
答案 3 :(得分:0)
开发人员没有开放公共API,因为当您的应用程序正在运行并且您接到电话时,您的应用程序将退出或可能处于后台,但您无法对设备进行任何更改。因为呼叫也是在系统级事件