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();
}
}
}
Единственный недостаток, который я вижу, состоит в том, что пользователь может вручную изменить настройки звука и вибрации канала уведомлений, которые будут играть вместе с вышеуказанными. В моем случае это не приветствуется, поскольку в настройках приложения есть явные настройки звука и вибрации.