Настройки вибрации на Android 2.2 - PullRequest
1 голос
/ 18 сентября 2010

Я делаю вибрирующий переключающий виджет (фактически, его первая версия уже есть в Маркете), но у меня есть некоторые проблемы с настройками вибрации Android 2.2.

До Android 2.1 Iбез проблем, когда я хочу отключить вибрацию, я делаю

am.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_OFF);
am.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION,AudioManager.VIBRATE_SETTING_OFF);

и то же самое, но с VIBRATE_SETTING_ON в обеих строках, чтобы включить его, и все работает нормально.

Однако,Так как в Android 2.2 появилось «Вибрировать только в беззвучном режиме» и «Вибрировать, когда не в беззвучном режиме», я не знаю, как заставить его работать.Когда вибрация установлена ​​на «Всегда» или «Никогда», проблем нет, но как только пользователь вручную установит один из двух других параметров, приложение начнет делать странные вещи.

Например, еслиУ меня установлено «вибрировать только в бесшумном режиме», и я отключаю вибрацию с помощью своего виджета, он выключается, но когда я снова включаю его, он возвращается к «только в бесшумном режиме» вместо «Всегда»,На самом деле, нет никакого способа установить его обратно на «Всегда», если вы не сделаете это через Настройки -> Звук, поэтому я предполагаю, что выпадающий список для режима вибрации делает что-то еще, о чем я не знаю.Это похоже на то, что оно сохранило значение где-то еще, потому что даже если я вручную установил «Всегда», когда я отключаю его и включаю снова через виджет (с кодом, который я опубликовал ранее), он продолжает возвращаться к «Вибрировать только в бесшумном режиме»».

И, более того, в классе AudioManager есть значение для «Только в бесшумном режиме» (VIBRATE_SETTING_ONLY_SILENT), но когда вы устанавливаете его в «Только когда не в бесшумном режиме», оно использует VIBRATE_SETTING_ON, поэтому нет никакого способаобнаружить это (я не имею в виду, я имею в виду).

Надеюсь, я не слишком запутался, но я хотел предоставить все возможные данные.И со всем этим набором ...

Кто-нибудь знает, как правильно обрабатывать настройки вибрации в 2.2?Есть ли какая-либо другая переменная, которую я должен установить или функцию, которую должен вызвать, чтобы полностью отключить или включить вибрацию?Или способ "сбросить" телефон до известного состояния, чтобы он работал нормально?

Шаги для воспроизведения проблемы (или, по крайней мере, одной из проблем):

  • Установите вибрацию на «только в бесшумном режиме» через меню настроек.

  • Установите вибрацию на «никогда» через виджет:

    setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_OFF);

  • Проверьте в меню настроек, что вибрация установлена ​​на «никогда».

  • Установите вибрацию на «всегда» с помощью виджета:

    setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ON);

  • Перейти в меню настроек -> Вибрация установлена ​​на «Только в бесшумном режиме»

Ответы [ 2 ]

9 голосов
/ 19 сентября 2010

Мне пришлось самим связываться с этими настройками, когда какое-то приложение испортило индивидуальные настройки моего Nexus One. Вот они:

Всегда вибрировать на кольце:

setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ON);

Никогда не вибрировать на кольце:

setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_OFF);

Вибрация при звонке только в беззвучном режиме:

setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT);

Всегда вибрировать при уведомлении:

setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_ON);

Никогда не вибрировать при уведомлении:

setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_OFF);

Вибрация при уведомлении только в беззвучном режиме:

setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_ONLY_SILENT);

Изменить режим звонка:

AudioManager.setRingerMode ( RINGER_MODE_NORMAL ); AudioManager.setRingerMode ( RINGER_MODE_SILENT ); AudioManager.setRingerMode ( RINGER_MODE_VIBRATE );

Настройки вибрации не зависят от настроек звонка. Возникает путаница.

1 голос
/ 26 сентября 2010

Хорошо, я думаю, наконец-то исправил.
Я посмотрел на исходный код класса com.android.settings.Settings и скопировал часть методов, которые включают и отключают вибрацию:
https://android.googlesource.com/platform/packages/apps/Settings/+/master/src/com/android/settings/SoundSettings.java

В любом случае, спасибо, magaio, вы указали мне правильное направление.

...