Specify vibrate attributes to resolve vibrate from background.

This commit is contained in:
Alex Hart 2024-05-07 09:24:39 -03:00
parent 9a0bb243cd
commit 52fb873b1b

View file

@ -8,6 +8,8 @@ import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
import androidx.annotation.NonNull;
@ -30,6 +32,10 @@ public class IncomingRinger {
private MediaPlayer player;
private final AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.build();
IncomingRinger(Context context) {
this.context = context.getApplicationContext();
this.vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
@ -49,7 +55,7 @@ public class IncomingRinger {
if (shouldVibrate(context, player, ringerMode, vibrate)) {
Log.i(TAG, "Starting vibration");
vibrator.vibrate(VIBRATE_PATTERN, 1);
startVibrate();
} else {
Log.i(TAG, "Skipping vibration");
}
@ -83,6 +89,17 @@ public class IncomingRinger {
vibrator.cancel();
}
private void startVibrate() {
if (Build.VERSION.SDK_INT >= 33) {
vibrator.vibrate(
VibrationEffect.createWaveform(VIBRATE_PATTERN, 1),
VibrationAttributes.createForUsage(VibrationAttributes.USAGE_RINGTONE)
);
} else {
vibrator.vibrate(VIBRATE_PATTERN, 1, audioAttributes);
}
}
/**
* Overrides the ringer mode if we are on the right API level and have the right policy access.
* Checks the ringer volume to make sure we're not going to blast someone with their ringtone inadvertently.