Как отключить вибрацию от определенных приложений в Android программно
Зависит от NotificationListenerService и его метода cancelNotification
Я могу отменить любое уведомление, которое приходит от конкретного приложения на основе имени пакета.
Но этот метод, кажется, не останавливает вибрацию этого уведомления, когда я использую cancelNotification
! Есть ли способ отключить вибрацию приходящих уведомлений? Или вообще я могу остановить вибрацию определенных приложений?
Я пытался перевести телефон в беззвучный режим, но это слишком медленная операция, так как уведомление будет отменено, затем начнется вибрация, а затем телефон будет в беззвучном режиме!
AudioManager aManager=(AudioManager)getSystemService(AUDIO_SERVICE);
aManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
if (android.os.Build.VERSION.SDK_INT >= 18 && android.os.Build.VERSION.SDK_INT <= 20) {
cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
} else if (android.os.Build.VERSION.SDK_INT >= 21) {
cancelNotification(sbn.getKey());
}
1 ответ
Текст об устаревании для setVibrateSetting() говорит:
Этот метод должен использоваться только приложениями, которые заменяют управление настройками звука на уровне платформы или основным приложением телефонии. Из того, что я понимаю, нет другой опции для глобального включения или отключения вибрации, поэтому, если у вас есть приложение, такое как менеджер профилей звонков, вам, вероятно, нужно его использовать.
ИМХО, Google использовал амортизацию здесь неуместно.
Я использую следующий класс, чтобы скрыть устаревание в одном классе "compat":
@SuppressWarnings("deprecation")
class AudioManagerCompat {
final static int VIBRATE_TYPE_RINGER = AudioManager.VIBRATE_TYPE_RINGER;
final static int VIBRATE_TYPE_NOTIFICATION = AudioManager.VIBRATE_TYPE_NOTIFICATION;
final static int VIBRATE_SETTING_ON = AudioManager.VIBRATE_SETTING_ON;
final static int VIBRATE_SETTING_OFF = AudioManager.VIBRATE_SETTING_OFF;
final static int VIBRATE_SETTING_ONLY_SILENT = AudioManager.VIBRATE_SETTING_ONLY_SILENT;
static int getVibrateSetting(AudioManager am, int vibrateType) {
return am.getVibrateSetting(vibrateType);
}
static void setVibrateSetting(AudioManager am, int vibrateType, int vibrateSetting) {
am.setVibrateSetting(vibrateType, vibrateSetting);
}
}