onSurfaceTextureAvailable in VideoView is never called...
I have this view that is holding the textureview.
public class MyMediaPlayer extends RelativeLayout{
Context mContext;
VideoView player;//this is a custom textureview that streams video
public MyMediaPlayer(Context context) {
super(context);
mContext = context;
init();
}
public MyMediaPlayer(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();
}
public MyMediaPlayer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
init();
}
private void init() {
setBackgroundColor(Color.BLACK);
player = new VideoView(mContext);
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
addView(player,lp);
}
public void setURL(String url){
player.setVideoPath(url);
}
public void start(){
player.start();
}
}
VideoView is set up like this:
public class VideoView extends TextureView {
public VideoView(final Context context) {
super(context);
mContext = context;
initVideoView();
}
public VideoView(final Context context, final AttributeSet attrs) {
super(context, attrs);
mContext = context;
initVideoView();
}
public VideoView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
initVideoView();
}
public void initVideoView() {
Log.d(LOG_TAG, "Initializing video view.");
videoHeight = 0;
videoWidth = 0;
setFocusable(false);
setSurfaceTextureListener(surfaceTextureListener);
}
SurfaceTextureListener surfaceTextureListener = new SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(final SurfaceTexture surface, final int width, final int height) {
Log.d(LOG_TAG, "Surface texture now avaialble.");
surfaceTexture = surface;
openVideo();
}
@Override
public void onSurfaceTextureSizeChanged(final SurfaceTexture surface, final int width, final int height) {
Log.d(LOG_TAG, "Resized surface texture: " + width + '/' + height);
surfaceWidth = width;
surfaceHeight = height;
boolean isValidState = (targetState == STATE_PLAYING);
boolean hasValidSize = (videoWidth == width && videoHeight == height);
if (mediaPlayer != null && isValidState && hasValidSize) {
start();
}
}
@Override
public boolean onSurfaceTextureDestroyed(final SurfaceTexture surface) {
Log.i(LOG_TAG, "Destroyed surface number " + number);
return false;
}
@Override
public void onSurfaceTextureUpdated(final SurfaceTexture surface) {
}
};
}
MyMediaPlayer is setup in a xml of a fragment.
If i place the VideoView inside the fragment then everything works fine.
But if it is in mymediaplayer inside the fragment onSurfaceTextureAvailable is never called.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…