以编程方式从应用程序中静音iPhone?

时间:2011-09-05 10:32:39

标签: iphone ios ipad cocoa-touch user-experience

我必须创建一个应用程序,其中iPhone在按钮按下事件时保持沉默。

你怎么能以编程方式做到这一点?

4 个答案:

答案 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,因为当您的应用程序正在运行并且您接到电话时,您的应用程序将退出或可能处于后台,但您无法对设备进行任何更改。因为呼叫也是在系统级事件