Как сказать в коде, если пользователь "заблокировал громкость" в своем меню настроек
В настоящее время я устанавливаю том на макс, а затем проверяю, находится ли объем в макс или меньшее значение. Если он имеет более низкое значение, тогда пользователь должен иметь блокировку громкости в своей системе.
Это отлично работает, но мне интересно, есть ли какой-нибудь метод для вызова или свойство для проверки, которое сообщает мне это в коде бесплатно? Я искал онлайн, как это сделать, но я не могу найти ничего. Спасибо заранее!
Изменить: Оказалось, что мой предыдущий метод установки максимального объема, а затем проверки, если он ниже, чтобы увидеть, есть ли блокировка тома, не работает на устройстве. Кажется, что объем масштабируется с помощью блокировки громкости, а не просто отключается.
Теперь я полностью застрял в этом. Существуют ли какие-либо частные методы или свойства, которые я могу использовать для обнаружения этого?
Ответы
Ответ 1
Я думаю, что вы просите, чтобы узнать, есть ли у iphone ограничение на ограничение объема. Я искал ответ, но не смог его найти. Вот способ проверить уровень громкости, надеюсь, что это поможет.
В вашем XIB вы можете добавить слайдер, чтобы проверить, на каком уровне громкости, так что в основном вы можете определить, является ли он тихим, и знать уровень громкости. Для более полного понимания этого класса, здесь ссылка http://blog.stormyprods.com/2008/09/proper-usage-of-mpvolumeview-class.html, но попробуйте это сначала:
Следующий код создаст нечто вроде панели томов.
- (void)viewDidLoad {
// create a frame for MPVolumeView image
CGRect frame = volumeViewHolder.bounds; // CGRectMake(0, 5, 180, 0);
volumeView = [[[MPVolumeView alloc] initWithFrame:frame] autorelease];
[volumeView sizeToFit];
[volumeViewHolder addSubview:volumeView];
for (UIView *view in [volumeView subviews]){
if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) {
volumeViewSlider = view;
}
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(volumeChanged:)
name:@"AVSystemController_SystemVolumeDidChangeNotification"
object:nil];
}
- (void) volumeChanged:(NSNotification *)notify
{
[volumeViewSlider setValue:[[[notify userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue]];
}
Я слышал, что по какой-то причине яблоко не позволяет вам продавать приложение, если вы используете определенный класс (тот, что в моем примере), но я не слишком уверен в этом, я бы дважды проверял и убедился что вам разрешено использовать его. Но код должен работать.
Ответ 2
Есть много ответов на эту проблему, но в какой-то момент все они, похоже, пали из рекомендаций Apple или кураторов App Store, поскольку Apple не предоставляет официального способа сделать это.
Однако одна из возможностей, которую вы можете использовать, чтобы найти это, заключается в том, что когда устройство отключается, ОС не будет воспроизводить звук вообще - так что если вы играете звуковой файл 800 мс, и у вас есть время, как долго нужно играть, если оно меньше 800 мс, тогда вы можете сделать вывод, что переключатель отключения звука включен.
Я бы рекомендовал использовать тихий звуковой файл 800 мс, чтобы использовать этот трюк, чтобы пользователь не внезапно столкнулся с неожиданным звуком.
См. здесь статью, которая вдохновила меня: http://inforceapps.wordpress.com/2009/07/08/detect-mute-switch-state-on-iphone/
Кроме того, вы можете использовать Audio Toolbox, чтобы сделать это просто и гарантировать, что используется переключатель отключения звука.
Ответ 3
Рассмотрим настройку громкости на максимум, затем запись выходного канала и воспроизведение короткого тона - затем сравните пик записанного образца с известным образцом, где ограничитель объема отсутствует. Это будет работать, если iPad масштабирует выходной объем до того, как запись получит доступ к нему.
Мне жаль, что у меня не было больше информации о том, как записывать вывод, но у меня нет большого личного опыта. Кто-то, кто разбирается в записи ввода, должен иметь возможность указать вам правильный путь.