Кажется, я не могу найти в SDK, как программно определять кнопку / переключатель отключения звука на iPhone. Когда мое приложение воспроизводит фоновую музыку, оно правильно реагирует на кнопку громкости, и у меня нет никакого кода для этого, но, когда я использую переключатель отключения звука, он просто продолжает играть.
Как проверить положение без звука?
(ПРИМЕЧАНИЕ: в моей программе есть собственный переключатель отключения звука, но я бы хотел, чтобы его переопределил физический переключатель.)





Оли,
Думаю, вы можете найти ответ на свой вопрос здесь:
https://devforums.apple.com/message/1135#1135
Я предполагаю, что у вас есть доступ к форумам разработчиков на Apple.com :)
Этот комментарий не очень полезен. Можете хоть цитату по опубликованной вами ссылке выложить?
Мертвая ссылка и сообщения, содержащие только ссылки, в любом случае не очень полезны.
Спасибо, JPM. Действительно, ссылка, которую вы предоставляете, приводит к правильному ответу (в конечном итоге .;) Для полноты (потому что S.O. должен быть источником БЫСТРЫХ ответов!) ...
// "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.");
}
если я потом зарегистрирую значение ambient, мне всегда будет возвращено 1634558569 независимо от того, отключен я или нет. Любая идея?
"Не работает" как? Что ты сделал? Чего вы ожидали? Что случилось вместо этого? Если вы предоставите дополнительную информацию, я постараюсь обновить свой ответ. Спасибо!
Не могли бы вы мне помочь: stackoverflow.com/questions/31604629/…
Я следовал общей теории и заставил это работать http://inforceapps.wordpress.com/2009/07/08/detect-mute-switch-state-on-iphone/
Вот резюме: Включите короткий беззвучный звук. Время, сколько времени нужно, чтобы играть. Если выключить звук, воспроизведение звука будет намного короче, чем сам звук. Я использовал звук 500 мс, и если звук воспроизводился меньше, чем это время, то переключатель отключения звука был включен. Я использую аудиоуслуги для воспроизведения беззвучного звука (который всегда учитывает выключение звука). В этой статье говорится, что вы можете использовать AVAudioPlayer для воспроизведения этого звука. Если вы используете AVAudioPlayer, я предполагаю, что вам нужно настроить категорию AVAudioSession для соблюдения выключателя звука, но я этого не пробовал.
Чтобы узнать состояние переключателя отключения звука и регулятора громкости, я написал эти две функции. Они идеальны, если вы хотите предупредить пользователя, прежде чем он попытается создать аудиовыход.
-(NSString*)audioRoute
{
CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
OSStatus n = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
if ( n )
{
// TODO: Throw an exception
NSLog( @"AudioSessionGetProperty: %@", osString( n ) );
}
NSString *result = (NSString*)state;
[result autorelease];
return result;
}
-(Float32)audioVolume
{
Float32 state;
UInt32 propertySize = sizeof(CFStringRef);
OSStatus n = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareOutputVolume, &propertySize, &state);
if ( n )
{
// TODO: Throw an exception
NSLog( @"AudioSessionGetProperty: %@", osString( n ) );
}
return state;
}
-(BOOL)isDeviceMuted
{
CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
return (CFStringGetLength(state) > 0 ? NO : YES);
}
(CFStringGetLength (состояние)> 0? NO: YES) совпадает с (CFStringGetLength (состояние) <= 0)
@simpleBob, как определить значение кнопки отключения звука iphone. (например, если переключатель отключения звука iphone включен (в режиме отключения звука), как определить значение отключения звука).
@ Yuvaraj.M Вот о чем этот вопрос. Выберите свой любимый ответ;) Например, вы можете просто запустить описанный выше метод, который вернет ДА, если на устройстве отключен звук.
@simpleBob Спасибо за ответ. И извините за беспокойство. Работает на всех ios? Он не работает в моем ios5 ?.
Я ответил на аналогичный вопрос здесь (ссылка). Соответствующий код:
-(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;
}
Именно то, что я искал. Спасибо, Пиррипли!
Это не работает, когда подключены наушники. AudioSessionGetProperty для аудиомаршрута возвращает «Наушники» независимо от выключения звука.
Но имеет ли значение, включен ли выключатель звука при подключении наушников? Звук по-прежнему воспроизводится через наушники, да? Мне кажется, что функция отключения звука предназначена для отключения звука телефона от других, а не от себя. Подчинение не должно иметь большого значения (imo), пока в наушниках. Похоже, Apple заняла такую позицию, вернув «наушники».
Больше не работает в iOS 5. stackoverflow.com/questions/6901363/…
Облом! Не единственное, что уже давно не работает в iOS5 ...;)
Переключатель отключения звука iphone не работает в ios5. Есть ли для этого какая-то причина.
AudioRoute не может определить состояние переключателя - режим Ambient - лучшее решение.
AudioSessionInitialize 'недоступен: больше не поддерживается
Часть кода в других ответах (включая принятый ответ) может не работать, если вы не находитесь в режиме окружающей среды, где соблюдается переключатель отключения звука.
Я написал процедуру ниже, чтобы переключиться на окружающий режим, прочитать переключатель, а затем вернуться к настройкам, которые мне нужны в моем приложении.
-(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;
}
Использование режима Окружающий для воспроизведения видео и режима PlayAndRecord для записи видео на экране камеры решает проблему в нашем случае.
Код в приложении: didFinishLaunchingWithOptions:
NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&error];
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeVideoRecording error:&error];
[[AVAudioSession sharedInstance] setActive:YES error:&error];
Код в viewWillAppear на cameraController, если вам нужно использовать камеру или запись в вашем приложении.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
Код в viewWillDisappear на cameraController
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
Используя эти строки, наше приложение записывает и воспроизводит видео, а переключатель отключения звука отлично работает как под iOS8, так и под iOS7 !!!
Не могли бы вы помочь мне, у меня есть функция VoIP-звонка в моем приложении, я должен воспроизводить музыку / мелодию звонка, когда пользователь получает звонок. Я хочу воспроизвести этот рингтон, даже если приложение находится в фоновом режиме. Если я использую «AVAudioSessionCategoryPlayAndRecord», он не работает с выключателем звука, если я использую «AVAudioSessionCategoryAmbient», он не воспроизводится в фоновом режиме. Пожалуйста, дайте мне предложения для достижения обоих случаев.
For Swift
Ниже рамки отлично работают в устройстве
https://github.com/akramhussein/Mute
Просто установите с помощью стручок или загрузите с Git
pod 'Mute'
и используйте, как показано ниже, код
import UIKit
import Mute
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel! {
didSet {
self.label.text = ""
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Notify every 2 seconds
Mute.shared.checkInterval = 2.0
// Always notify on interval
Mute.shared.alwaysNotify = true
// Update label when notification received
Mute.shared.notify = { m in
self.label.text = m ? "Muted" : "Not Muted"
}
// Stop after 5 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
Mute.shared.isPaused = true
}
// Re-start after 10 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 10.0) {
Mute.shared.isPaused = false
}
}
}
в симуляторе всегда отображается "Без звука"
Шо нуфф! Краткое резюме: «AudioSessionSetProperty для установки AudioCategory в Ambient» (я считаю, что можно говорить о доставке программного обеспечения ...) Спасибо!