最后我放弃了使用声音和振动的通知渠道来获得跨 Android 版本的一致结果。
channel.setSound(null, null);
并将MediaPlayer
andVibrator
与这样的辅助类一起使用:
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();
}
}
}
我看到的唯一缺点是用户可以手动更改通知频道的声音和振动设置,该频道将与上述频道一起播放。在我的情况下,通过在应用程序设置中明确偏好声音和振动来阻止这种情况。