Как отключить вибрацию от определенных приложений в 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);
    }
}
Другие вопросы по тегам