From 909b52d4f7143a247c80e064472fb827f2342798 Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 8 Sep 2023 11:58:36 +0800 Subject: [PATCH] Fix crash --- .../com/fongmi/android/tv/player/Players.java | 55 ++++++++++++++----- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index 1649d6d94..875c411bc 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -3,12 +3,14 @@ package com.fongmi.android.tv.player; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; +import android.os.PowerManager; import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.PlaybackStateCompat; import android.text.TextUtils; import androidx.annotation.NonNull; +import androidx.media3.common.C; import androidx.media3.common.PlaybackException; import androidx.media3.common.Player; import androidx.media3.common.util.Util; @@ -90,7 +92,13 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic private void createSession(Activity activity) { session = new MediaSessionCompat(activity, "TV"); - session.setSessionActivity(PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()), Utils.getPendingFlag())); + session.setSessionActivity(PendingIntent.getActivity(App.get(), 99, new Intent(App.get(), activity.getClass()), Utils.getPendingFlag())); + session.setCallback(new MediaSessionCompat.Callback() { + @Override + public void onSeekTo(long pos) { + seekTo(pos, true); + } + }); } public void set(PlayerView exo, IjkVideoView ijk) { @@ -165,19 +173,27 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic } public float getSpeed() { - return isExo() ? exoPlayer.getPlaybackParameters().speed : ijkPlayer.getSpeed(); + if (isExo() && exoPlayer != null) return exoPlayer.getPlaybackParameters().speed; + if (isIjk() && ijkPlayer != null) return ijkPlayer.getSpeed(); + return 1.0f; } public long getPosition() { - return isExo() ? exoPlayer.getCurrentPosition() : ijkPlayer.getCurrentPosition(); + if (isExo() && exoPlayer != null) return exoPlayer.getCurrentPosition(); + if (isIjk() && ijkPlayer != null) return ijkPlayer.getCurrentPosition(); + return 0; } public long getDuration() { - return isExo() ? exoPlayer.getDuration() : ijkPlayer.getDuration(); + if (isExo() && exoPlayer != null) return exoPlayer.getDuration(); + if (isIjk() && ijkPlayer != null) return ijkPlayer.getDuration(); + return -1; } public long getBuffered() { - return isExo() ? exoPlayer.getBufferedPosition() : ijkPlayer.getBufferedPosition(); + if (isExo() && exoPlayer != null) return exoPlayer.getBufferedPosition(); + if (isIjk() && ijkPlayer != null) return ijkPlayer.getBufferedPosition(); + return 0; } public boolean isPlaying() { @@ -262,26 +278,32 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic } public void seekTo(int time) { - if (isExo()) exoPlayer.seekTo(getPosition() + time); - else if (isIjk()) ijkPlayer.seekTo(getPosition() + time); + if (isExo() && exoPlayer != null) exoPlayer.seekTo(getPosition() + time); + if (isIjk() && ijkPlayer != null) ijkPlayer.seekTo(getPosition() + time); } public void seekTo(long time, boolean force) { if (time == 0 && !force) return; - if (isExo()) exoPlayer.seekTo(time); - else if (isIjk()) ijkPlayer.seekTo(time); + if (isExo() && exoPlayer != null) exoPlayer.seekTo(time); + if (isIjk() && ijkPlayer != null) ijkPlayer.seekTo(time); + } + + public void setWake(boolean wake) { + if (isExo() && exoPlayer != null) exoPlayer.setWakeMode(wake ? C.WAKE_MODE_NETWORK : C.WAKE_MODE_NONE); + if (isIjk() && ijkPlayer != null) ijkPlayer.setWakeMode(wake ? PowerManager.PARTIAL_WAKE_LOCK : PowerManager.ON_AFTER_RELEASE); } public void play() { + session.setActive(true); if (isExo()) exoPlayer.play(); else if (isIjk()) ijkPlayer.start(); - session.setActive(true); + setPlaybackState(PlaybackStateCompat.STATE_PLAYING); } public void pause() { if (isExo()) pauseExo(); else if (isIjk()) pauseIjk(); - session.setActive(false); + setPlaybackState(PlaybackStateCompat.STATE_PAUSED); } public void stop() { @@ -289,6 +311,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic if (isExo()) stopExo(); else if (isIjk()) stopIjk(); session.setActive(false); + setPlaybackState(PlaybackStateCompat.STATE_STOPPED); } public void release() { @@ -438,6 +461,10 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic } } + private void setPlaybackState(int state) { + session.setPlaybackState(new PlaybackStateCompat.Builder().setState(state, getPosition(), getSpeed()).build()); + } + @Override public void onParseSuccess(Map headers, String url, String from) { setMediaSource(headers, url); @@ -452,16 +479,17 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic @Override public void onEvents(@NonNull Player player, @NonNull Player.Events events) { - session.setPlaybackState(new PlaybackStateCompat.Builder().setState(isPlaying() ? PlaybackStateCompat.STATE_PLAYING : PlaybackStateCompat.STATE_PAUSED, getPosition(), getSpeed()).build()); + setPlaybackState(isPlaying() ? PlaybackStateCompat.STATE_PLAYING : PlaybackStateCompat.STATE_PAUSED); } @Override public void onBufferingUpdate(IMediaPlayer mp, int percent) { - session.setPlaybackState(new PlaybackStateCompat.Builder().setState(isPlaying() ? PlaybackStateCompat.STATE_PLAYING : PlaybackStateCompat.STATE_PAUSED, getPosition(), getSpeed()).build()); + setPlaybackState(isPlaying() ? PlaybackStateCompat.STATE_PLAYING : PlaybackStateCompat.STATE_PAUSED); } @Override public void onPlayerError(@NonNull PlaybackException error) { + setPlaybackState(PlaybackStateCompat.STATE_ERROR); this.errorCode = error.errorCode; ErrorEvent.format(2); } @@ -496,6 +524,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic @Override public boolean onError(IMediaPlayer mp, int what, int extra) { + setPlaybackState(PlaybackStateCompat.STATE_ERROR); ErrorEvent.format(1); return true; }