Настройки вибрации на Android 2.2

Делаю виджет переключения вибрации (на самом деле его первая версия уже есть в Маркете) но у меня какие-то проблемы с настройками вибрации Андроида 2.2.

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

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

  • Заходим в меню настроек -> Вибрация установлена ​​на "Только в беззвучном режиме"

person luthier    schedule 18.09.2010    source источник


Ответы (2)


Мне пришлось самому возиться с этими настройками, когда какое-то приложение испортило индивидуальные настройки моего 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);

Настройки вибрации не зависят от настроек звонка. Наступает замешательство.

person magaio    schedule 19.09.2010
comment
Спасибо, магайо, но у меня все еще есть проблема ... Я добавил шаги, чтобы воспроизвести проблему в вопросе. - person luthier; 20.09.2010
comment
LuTHieR, вам, вероятно, нужно использовать комбинацию настройки вибрации, а также настройки звонка. Это сбивает с толку, я знаю. Приложение «Настройки Android» фактически меняет настройку звонка (см. Мое редактирование внизу ответа). Если вы хотите по-настоящему никогда не вибрировать, вам нужно установитьVibrateSetting(... VIBRATE_SETTING_OFF) и установитьRingerMode(...RINGER_MODE_NORMAL). Попробуйте. - person magaio; 20.09.2010
comment
Еще раз спасибо, я попробую сегодня днем, когда вернусь домой, и скажу вам, сработало ли это :) - person luthier; 21.09.2010
comment
Привет магаио, извините за задержку. Я пробовал, но он продолжает делать то же самое :( Я пытался установить режим звонка на Нормальный как до, так и после изменения настроек вибрации, но все равно не повезло. Спасибо за ваше время и идеи, однако :) - person luthier; 25.09.2010

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

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

person luthier    schedule 26.09.2010