NotificationChannel уведомление как сигнал тревоги, когда телефон отключен (Oreo)

Я устанавливаю NotificationCompat.Builder с помощью:

.setSound(getNotificationSound(), AudioManager.STREAM_ALARM)
.setCategory(NotificationCompat.CATEGORY_ALARM)
.setPriority(NotificationCompat.PRIORITY_MAX)

среди других обязательных свойств.

Для канала NotificationChannel, который я использую, я добавил:

.setBypassDnd(true)

Для Oreo проблема в том, что:

  • при срабатывании оповещения не слышен звук, когда телефон отключен или вибрирует, поэтому он не работает как сигнал тревоги

Какой смысл в кнопке Не беспокоить настраиваемое исключение из категории / канала уведомлений? Может ли это помочь в достижении моей цели, потому что я не видел различий?

Для версий старше Oreo, где я не использую NotificationChannel, у меня есть поведение, которое я предпочитаю:

  • Звук уведомлений работает, когда телефон отключен, но нет вибрации
  • Звук уведомлений И вибрация работает, когда телефон работает на вибрации или с включенным звуком

Есть идеи, как решить эту проблему?

1 ответ

Решение

В конце концов я отказался от использования каналов уведомлений для звука и вибрации, чтобы получить согласованные результаты во всех версиях Android.

channel.setSound(null, null);

и использовал MediaPlayer а также Vibrator вместо этого с помощью вспомогательного класса:

public class RingtoneAndVibrationPlayer extends ContextWrapper{

private MediaPlayer mMediaPlayer;
private Vibrator mVibrator;

public RingtoneAndVibrationPlayer(Context context) {
    super(context);
}

public void play() {
    try {
        mMediaPlayer = new MediaPlayer();
        mVibrator = (Vibrator) this.getSystemService(VIBRATOR_SERVICE);

        final Uri uri = Uri.parse(PreferenceHelper.getNotificationSound();

        mMediaPlayer.setDataSource(this, uri);
        if (PreferenceHelper.isRingtoneEnabled()) {
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
            mMediaPlayer.setLooping(PreferenceHelper.isRingtoneInsistent());
            mMediaPlayer.prepareAsync();
        }

        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mMediaPlayer.start();
            }
        });

        if (PreferenceHelper.isVibrationEnabled()) {
            mVibrator.vibrate(new long[] {0, 500, 500, 500},
                    PreferenceHelper.isRingtoneInsistent() ? 2 : -1);
        }
    } catch (SecurityException | IOException e) {
        stop();
    }
}

public void stop() {
    if (mMediaPlayer != null && mVibrator != null) {
        mMediaPlayer.reset();
        mMediaPlayer.release();
        mMediaPlayer = null;
    }
    if (mVibrator != null) {
        mVibrator.cancel();
    }
}
}

Единственный недостаток, который я вижу, состоит в том, что пользователь может вручную изменить настройки звука и вибрации канала уведомлений, которые будут играть вместе с вышеуказанными. В моем случае это не приветствуется, поскольку в настройках приложения есть явные настройки звука и вибрации.

Другие вопросы по тегам