2

我将NotificationCompat.Builder设置为:

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

在其他强制性属性中。

对于我正在使用的NotificationChannel,我添加了:

.setBypassDnd(true)

对于奥利奥来说,问题在于:

  • 当手机静音或振动时,触发的通知没有任何声音,因此它不像警报一样

不要打扰通知类别/频道中的自定义异常切换按钮有什么意义?因为我没有看到任何差异,它可以帮助实现我的目标吗?

对于比 Oreo 更早的版本,我没有使用 NotificationChannel,我有一个我喜欢的行为:

  • 当手机静音但没有振动时,通知声音有效
  • 通知声音和振动在手机处于振动或启用声音时起作用

任何想法如何解决这种不一致?

4

1 回答 1

0

最后我放弃了使用声音和振动的通知渠道来获得跨 Android 版本的一致结果。

channel.setSound(null, null);

并将MediaPlayerandVibrator与这样的辅助类一起使用:

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

我看到的唯一缺点是用户可以手动更改通知频道的声音和振动设置,该频道将与上述频道一起播放。在我的情况下,通过在应用程序设置中明确偏好声音和振动来阻止这种情况。

于 2018-08-14T15:14:35.323 回答