Как обнаружить iphone в беззвучном режиме
Я разрабатываю приложение. В том, что я хочу определить через кодирование, что "iPhone в беззвучном режиме или нет?". Я разрабатываю его, используя какао с Objective-C.
Если кто-то знает, пожалуйста, ответьте.
4 ответа
Причина, по которой код Pirripli не работает, заключается в том, что симулятор не поддерживает тест и код не проверяет наличие ошибок. Исправленный код будет выглядеть так:
CFStringRef state = nil;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
if (status == kAudioSessionNoError)
{
return (CFStringGetLength(state) == 0); // YES = silent
}
return NO;
Это возможно, протестировав аудио-маршрут NULL с помощью AudioToolBox:
UInt32 routeSize = sizeof (CFStringRef);
CFStringRef route;
AudioSessionGetProperty (
kAudioSessionProperty_AudioRoute,
&routeSize,
&route
);
if (route == NULL) {
NSLog(@"Silent switch is on");
}
Если маршрут НЕДЕЙСТВИТЕЛЕН, тогда нет доступных аудиовыходов. Если это "Гарнитура" или "Наушники", то тихий переключатель звонка все еще может быть включен. Тем не менее, он никогда не будет включен, когда он установлен на "Динамик".
Вы, вероятно, лучше всего тестируете это в своем слушателе свойства изменения маршрута аудио, который установлен ниже:
AudioSessionAddPropertyListener (
kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
self
);
Примечание. Если вы делаете что-то необычное, например, переопределение аудио-маршрутов, этот ответ может быть неприменим.
Настройка и срыв аудио-сеанса в целом, вероятно, выходят за рамки этого ответа.
Для полноты, основываясь на этой ссылке от Дана Бона, я реализую следующий метод для решения этой проблемы в своих приложениях. Следует отметить, что код сначала проверяет симулятор iPhone - выполнение приведенного ниже кода приведет к сбою симулятора. Кто-нибудь знает почему?
-(BOOL)silenced {
#if TARGET_IPHONE_SIMULATOR
// return NO in simulator. Code causes crashes for some reason.
return NO;
#endif
CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
if(CFStringGetLength(state) > 0)
return NO;
else
return YES;
}
Объявив это право в контроллере вида, вы просто проверите
if ([self silenced]) {
NSLog(@"silenced");
else {
NSLog(@"not silenced");
}
Или, очевидно, вы можете объявить это в каком-то вспомогательном классе. Более элегантным решением может быть добавление категории в UIApplication или какой-то другой такой класс...
Вы можете использовать свойство Audio Route, как было предложено в предыдущих ответах, но имейте в виду, что: - оно работает только в том случае, если в качестве категории аудио выбрано AmbientSound - вам не следует инициализировать аудиосеанс в вашем приложении более одного раза (см. Руководство по программированию аудиосеансов) - Вы должны освободить эти CFStringRef, чтобы избежать утечек памяти
Однако, если текущая категория аудио не является AmbientSound, вы можете временно изменить ее, выполнить проверку свойства Audio Route, а затем восстановить исходную категорию аудио.
Обратите внимание, что изменение категории аудио приведет к восстановлению маршрута аудио по умолчанию для этой категории с учетом текущей конфигурации оборудования (т. Е. Подключены ли наушники или нет, и т. Д.).