2023-12-01 16:17:06 +08:00
|
|
|
package com.xixun.xixunplayer;
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
import android.media.MediaPlayer;
|
|
|
|
import android.view.Choreographer;
|
|
|
|
import android.widget.VideoView;
|
|
|
|
|
|
|
|
public class EleVideo2 extends VideoView implements Choreographer.FrameCallback {
|
|
|
|
|
|
|
|
float vol = 1;
|
|
|
|
|
|
|
|
public EleVideo2(String path, Context context) {
|
|
|
|
super(context);
|
|
|
|
setVideoPath(path);
|
|
|
|
setOnPreparedListener((MediaPlayer player)->{
|
|
|
|
player.setLooping(true);
|
|
|
|
if(! isShown()) {
|
|
|
|
player.seekTo(0);
|
|
|
|
player.pause();
|
|
|
|
}
|
|
|
|
if(vol!=1) player.setVolume(vol, vol);
|
|
|
|
setOnPreparedListener(null);
|
|
|
|
});
|
|
|
|
setOnErrorListener((MediaPlayer mp, int what, int extra)->{
|
|
|
|
var err = "Media Error: "+getErrorName(what)+". "+getErrorName(extra);
|
|
|
|
Util.makeText(getContext(), err).show();
|
2024-01-24 20:17:59 +08:00
|
|
|
Util.println(err);
|
2023-12-01 16:17:06 +08:00
|
|
|
return true;
|
|
|
|
});
|
|
|
|
start();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
|
|
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onVisibilityAggregated(boolean isVisible) {
|
|
|
|
super.onVisibilityAggregated(isVisible);
|
|
|
|
if(isVisible) {
|
2024-01-24 20:17:59 +08:00
|
|
|
Util.println("Video Show");
|
2023-12-01 16:17:06 +08:00
|
|
|
if(! isPlaying()) {
|
|
|
|
seekTo(0);
|
|
|
|
start();
|
|
|
|
seekTo(0);
|
2024-01-24 20:17:59 +08:00
|
|
|
if(! isPlaying()) Util.println("Video isn't Playing on Show");
|
2023-12-01 16:17:06 +08:00
|
|
|
}
|
|
|
|
} else {
|
2024-01-24 20:17:59 +08:00
|
|
|
Util.println("Video Hide");
|
2023-12-01 16:17:06 +08:00
|
|
|
seekTo(0);
|
|
|
|
pause();
|
|
|
|
seekTo(0);
|
|
|
|
showCnt = 3;
|
2024-01-24 20:17:59 +08:00
|
|
|
if(canAdd) {
|
|
|
|
choreographer.postFrameCallback(this);
|
|
|
|
canAdd = false;
|
|
|
|
}
|
2023-12-01 16:17:06 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Choreographer choreographer = Choreographer.getInstance();
|
|
|
|
int showCnt;
|
2024-01-24 20:17:59 +08:00
|
|
|
boolean canAdd = true;
|
2023-12-01 16:17:06 +08:00
|
|
|
@Override
|
|
|
|
public void doFrame(long frameTimeNanos) {
|
|
|
|
if(isShown()) {
|
|
|
|
seekTo(0);
|
|
|
|
if(! isPlaying()) {
|
|
|
|
start();
|
|
|
|
seekTo(0);
|
|
|
|
if(! isPlaying()) {
|
2024-01-24 20:17:59 +08:00
|
|
|
Util.println("Video isn't Playing on doFrame "+showCnt);
|
2023-12-01 16:17:06 +08:00
|
|
|
if(showCnt==0) {
|
|
|
|
suspend();
|
|
|
|
resume();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(showCnt>0) showCnt--;
|
2024-01-24 20:17:59 +08:00
|
|
|
else {
|
|
|
|
canAdd = true;
|
|
|
|
return;
|
|
|
|
}
|
2023-12-01 16:17:06 +08:00
|
|
|
} else if(isPlaying()) {
|
|
|
|
seekTo(0);
|
|
|
|
pause();
|
|
|
|
seekTo(0);
|
2024-01-24 20:17:59 +08:00
|
|
|
Util.println("pause in doFrame()");
|
2023-12-01 16:17:06 +08:00
|
|
|
}
|
|
|
|
choreographer.postFrameCallback(this);
|
2024-01-24 20:17:59 +08:00
|
|
|
canAdd = false;
|
2023-12-01 16:17:06 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static String getErrorName(int code) {
|
|
|
|
if(code==MediaPlayer.MEDIA_ERROR_UNKNOWN) return "UNKNOWN";
|
|
|
|
if(code==MediaPlayer.MEDIA_ERROR_SERVER_DIED) return "SERVER_DIED";
|
|
|
|
if(code==MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK) return "NOT_VALID_FOR_PROGRESSIVE_PLAYBACK";
|
|
|
|
if(code==MediaPlayer.MEDIA_ERROR_IO) return "IO";
|
|
|
|
if(code==MediaPlayer.MEDIA_ERROR_MALFORMED) return "MALFORMED";
|
|
|
|
if(code==MediaPlayer.MEDIA_ERROR_UNSUPPORTED) return "UNSUPPORTED";
|
|
|
|
if(code==MediaPlayer.MEDIA_ERROR_TIMED_OUT) return "TIMED_OUT";
|
|
|
|
if(code==-2147483648) return "SYSTEM";
|
|
|
|
return "Unknown ("+code+")";
|
|
|
|
}
|
|
|
|
}
|