Программно отключить iPhone из приложения? - PullRequest
1 голос
/ 05 сентября 2011

Мне нужно создать приложение, в котором iPhone замолкает после нажатия кнопки.

Как вы можете сделать это программно?

Ответы [ 4 ]

6 голосов
/ 05 сентября 2011

Нет ничего в официальном iOS SDK, чтобы сделать это. Представьте, что кто-то пропустил важный звонок, потому что приложение изменило настройки и заставило телефон замолчать без ведома пользователя. Я не хочу загружать это приложение наверняка. См. этот связанный вопрос тоже.

Из документации Apple

Люди, а не приложения, должны инициировать и контролировать действия. Хотя приложение может предложить курс действий или предупредить о опасные последствия, как правило, ошибка для приложения, чтобы принять принятие решений от пользователя. Лучшие приложения находят правильные баланс между предоставлением людям возможностей, которые им нужны, помогая они избегают опасных результатов.

Если я не ошибаюсь, отключение телефона - одно из таких действий.

Прочитать звуковой раздел apple Документация .

РЕДАКТИРОВАТЬ: Если вы хотите больше информации.

Перейдите на форум разработчиков Apple (у вас должен быть логин) и просмотрите эту ветку . Парень, который отвечает, есть сотрудник Apple.

2 голосов
/ 05 сентября 2011
// "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.");
}

Надеюсь, это поможет вам ...

1 голос
/ 05 сентября 2011
-(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;
}

сначала переключитесь на окружающий, прочитайте переключатель, а затем вернитесь к настройкам ...

0 голосов
/ 05 сентября 2011

общедоступный API-интерфейс открыт для разработчиков, потому что когда ваше приложение работает и вы получили вызов, ваше приложение будет закрыто или может находиться в фоновом режиме, но вы не можете вносить какие-либо изменения в устройство. Потому что также выполняется вызовна системном уровне событие

...