it-swarm.com.de

textureview onSurfaceTextureAvailable wurde nicht innerhalb von relativelayout in fragment aufgerufen

onSurfaceTextureAvailable in VideoView wird nie aufgerufen ...
Ich habe diese Ansicht, die die Texturansicht hält.

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 ist folgendermaßen eingerichtet:

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 wird in einer XML-Datei eines Fragments eingerichtet.
Wenn ich das VideoView im Fragment platziere, funktioniert alles gut.
Aber wenn es sich in mymediaplayer innerhalb des Fragments onSurfaceTextureAvailable befindet, wird es nie aufgerufen.

19
Amitay Molko

onSurfaceTextureAvailable scheint nicht aufgerufen zu werden, wenn die SurfaceTexture bereits verfügbar ist. Sie können überprüfen, ob es verfügbar ist, und Ihre onSurfaceTextureAvailable-Methode wie unten beschrieben aufrufen.

textureView.setSurfaceTextureListener(this);

/*
 * onSurfaceTextureAvailable does not get called if it is already available.
 */
if (view.isAvailable()) {
    onSurfaceTextureAvailable(view.getSurfaceTexture(), view.getWidth(), view.getHeight());
}
19
Steve Prentice

Für mich ist der Schlüssel zur Lösung des Problems das Hinzufügen von Android: hardwareAccelerated = "true" für die Aktivität in der AndroidManifest.xml.

Sie können TextureView in einem Scrolling-Container (wie z. B. ListView, ScrollView, ViewPager usw.) nur verwenden, wenn die Aktivität für die TextureView mit hardwareAccelerated-Eigenschaft aktiviert ist.

Die letzten Worte in diesem Blog erwähnten, dass

Ich hoffe es funktioniert für dich.

13
Fish Yu

In meinem Fall hatte ich zunächst meine TextureView unsichtbar und wurde dann geladen, nachdem ich einige Daten abgerufen hatte. Dies führte dazu, dass onSurfaceTextureAvailable nicht aufgerufen wurde. Ich vermute, dass, um gesagt zu werden, dass TextureView 'verfügbar' ist, es sichtbar sein muss. Meine Lösung bestand darin, die TextureView von Anfang an sichtbar zu machen.

8
Tash Pemhiwa

Sie müssen die Hardwarebeschleunigung aktivieren, um TextureView verwenden zu können. Andernfalls werden die Callback-Methoden nicht aufgerufen. Versehen Sie einfach die onCreate-Methode Ihrer Aktivität:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

Es hat für mich funktioniert.

5
Shibakaneki

ich hatte das gleiche Problem und löste es seltsam mit dem folgenden Code

videoPreview = (TextureView) linearLayout.findViewById(R.id.videoView);
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)videoPreview.getLayoutParams();
params.height = 130;
params.width = 508;
videoPreview.setLayoutParams(params);
videoPreview.setSurfaceTextureListener(this);

Seltsamer, wenn ich nur die Breite oder Höhe der Dosentätigkeit setze.

3
Rany A. Ishak

Ich habe das gleiche Problem getroffen, onSurfaceTextureAvailable rief nie an. Schließlich habe ich festgestellt, dass mein textureview vor setSurfaceTextureListener unsichtbar ist. Überprüfen Sie also zunächst den Status von textureview.

1
San Zhang

versuchen Sie, mTextureView.setSurfaceTextureListener() in onCreate() zu setzen.

Grundursache ist: onCreate() -> drawUI -> getHardwareLayer() -> callback SurfaceTextureListener. Um dieses Problem zu beheben: setSurfaceTextureListener() vor der Benutzeroberfläche die Benutzeroberfläche zeichnen oder neu zeichnen.

0
sunke