Single instance embedded music player

This commit is contained in:
M66B
2024-01-23 17:42:07 +01:00
parent b673256c25
commit e4871a5170
3 changed files with 78 additions and 66 deletions

View File

@@ -28,6 +28,7 @@ import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.os.PowerManager;
import androidx.core.app.NotificationCompat;
import androidx.lifecycle.Lifecycle;
@@ -36,6 +37,7 @@ import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@@ -46,6 +48,10 @@ public class MediaPlayerHelper {
private static Semaphore sem;
private static final Object lock = new Object();
private static MediaPlayer player = null;
private static Uri uri = null;
private static Runnable onCompleted = null;
static void stop(Context context) {
EntityLog.log(context, "Alarm stop");
synchronized (lock) {
@@ -155,6 +161,63 @@ public class MediaPlayerHelper {
}
}
static void startMusic(Context context, Uri uri, Runnable onCompleted) throws IOException {
stopMusic(context);
synchronized (lock) {
MediaPlayerHelper.uri = uri;
MediaPlayerHelper.onCompleted = onCompleted;
MediaPlayerHelper.player = new MediaPlayer();
MediaPlayerHelper.player.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
MediaPlayerHelper.player.setDataSource(context, uri);
MediaPlayerHelper.player.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK);
MediaPlayerHelper.player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// https://issuetracker.google.com/issues/36921987
mp.start();
}
});
MediaPlayerHelper.player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stopMusic(context);
}
});
MediaPlayerHelper.player.prepareAsync();
}
}
static void stopMusic(Context context) {
synchronized (lock) {
if (MediaPlayerHelper.player != null)
try {
MediaPlayerHelper.player.stop();
} catch (Throwable ex) {
Log.e(ex);
} finally {
MediaPlayerHelper.player = null;
}
MediaPlayerHelper.uri = null;
if (MediaPlayerHelper.onCompleted != null) {
MediaPlayerHelper.onCompleted.run();
MediaPlayerHelper.onCompleted = null;
}
}
}
static boolean isPlaying(Uri uri) {
synchronized (lock) {
return (Objects.equals(MediaPlayerHelper.uri, uri));
}
}
static void liveInCall(Context context, LifecycleOwner owner, IInCall intf) {
AudioManager am = Helper.getSystemService(context, AudioManager.class);
if (am == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {