Как программно определить переключатель отключения звука iPhone?

Кажется, я не могу найти в SDK, как программно определять кнопку / переключатель отключения звука на iPhone. Когда мое приложение воспроизводит фоновую музыку, оно правильно реагирует на кнопку громкости, и у меня нет никакого кода для этого, но, когда я использую переключатель отключения звука, он просто продолжает играть.

Как проверить положение без звука?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
50
0
42 375
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Оли,

Думаю, вы можете найти ответ на свой вопрос здесь:

https://devforums.apple.com/message/1135#1135

Я предполагаю, что у вас есть доступ к форумам разработчиков на Apple.com :)

Шо нуфф! Краткое резюме: «AudioSessionSetProperty для установки AudioCategory в Ambient» (я считаю, что можно говорить о доставке программного обеспечения ...) Спасибо!

Olie 15.11.2008 10:42

Этот комментарий не очень полезен. Можете хоть цитату по опубликованной вами ссылке выложить?

der_michael 20.11.2018 21:16

Мертвая ссылка и сообщения, содержащие только ссылки, в любом случае не очень полезны.

Reid 09.08.2020 02:41
Ответ принят как подходящий

Спасибо, 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 независимо от того, отключен я или нет. Любая идея?

Finn Gaida 15.11.2013 02:01

"Не работает" как? Что ты сделал? Чего вы ожидали? Что случилось вместо этого? Если вы предоставите дополнительную информацию, я постараюсь обновить свой ответ. Спасибо!

Olie 13.06.2015 04:30

Не могли бы вы мне помочь: stackoverflow.com/questions/31604629/…

Ganee.... 06.08.2015 11:09

Я следовал общей теории и заставил это работать 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)

Daniel 19.10.2010 16:52

@simpleBob, как определить значение кнопки отключения звука iphone. (например, если переключатель отключения звука iphone включен (в режиме отключения звука), как определить значение отключения звука).

Yuvaraj.M 24.11.2012 17:16

@ Yuvaraj.M Вот о чем этот вопрос. Выберите свой любимый ответ;) Например, вы можете просто запустить описанный выше метод, который вернет ДА, если на устройстве отключен звук.

Daniel 26.11.2012 14:21

@simpleBob Спасибо за ответ. И извините за беспокойство. Работает на всех ios? Он не работает в моем ios5 ?.

Yuvaraj.M 26.11.2012 16:01

Я ответил на аналогичный вопрос здесь (ссылка). Соответствующий код:

 -(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;

    }

Именно то, что я искал. Спасибо, Пиррипли!

James Skidmore 23.03.2011 07:55

Это не работает, когда подключены наушники. AudioSessionGetProperty для аудиомаршрута возвращает «Наушники» независимо от выключения звука.

yood 07.05.2011 02:17

Но имеет ли значение, включен ли выключатель звука при подключении наушников? Звук по-прежнему воспроизводится через наушники, да? Мне кажется, что функция отключения звука предназначена для отключения звука телефона от других, а не от себя. Подчинение не должно иметь большого значения (imo), пока в наушниках. Похоже, Apple заняла такую ​​позицию, вернув «наушники».

Chris Ladd 21.05.2011 02:22

Больше не работает в iOS 5. stackoverflow.com/questions/6901363/…

morgancodes 05.11.2011 21:07

Облом! Не единственное, что уже давно не работает в iOS5 ...;)

Chris Ladd 09.11.2011 20:59

Переключатель отключения звука iphone не работает в ios5. Есть ли для этого какая-то причина.

Yuvaraj.M 28.11.2012 11:19

AudioRoute не может определить состояние переключателя - режим Ambient - лучшее решение.

slamor 09.12.2014 21:22

AudioSessionInitialize 'недоступен: больше не поддерживается

Daniel Springer 07.11.2018 01:30

Часть кода в других ответах (включая принятый ответ) может не работать, если вы не находитесь в режиме окружающей среды, где соблюдается переключатель отключения звука.

Я написал процедуру ниже, чтобы переключиться на окружающий режим, прочитать переключатель, а затем вернуться к настройкам, которые мне нужны в моем приложении.

-(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», он не воспроизводится в фоновом режиме. Пожалуйста, дайте мне предложения для достижения обоих случаев.

Ganee.... 30.07.2015 10:31

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
        }
    }

}

в симуляторе всегда отображается "Без звука"

balkaran singh 22.12.2020 11:31

Другие вопросы по теме