Jedes Mal, wenn ich meine Aktivität (eigentlich Fragment) pausiere, um zu einer anderen App zu gehen, versuche ich bei der Rückkehr mit onResume das Video wiederzugeben, aber es spielt nicht: Ich bekomme einen leeren Bildschirm. Nach der Untersuchung sehe ich Folgendes in der Logcat
%Vor%Hier ist der Code, den ich innen auf Lebenslauf
rufe %Vor%Zu Ihrer Information: Ich habe versucht, diese Antwort auf meinen Fall anzuwenden, aber ich kann nicht: Was kann ich tun, wenn die BufferQueue abgebrochen wurde?
AKTUALISIEREN
Ich kämpfte darum, es alleine zu machen, aber ich stoße immer noch zusammen. Also poste ich den ganzen Code für Hilfe
%Vor%Es scheint einen Bug in Ihrem Code zu geben: In SurfaceTextureDestroyed () haben Sie die Oberfläche oder den MediaPlayer nicht zurückgesetzt. Wenn resume, weder mediaPlayer noch Oberfläche ist null, so in resumeVideoUponReturningFromAnotherActivity () legen Sie die Oberfläche und Aufruf starten zu spielen, aber Oberfläche bereits wegen der vorherigen SurfaceTextureDestroyed ungültig werden. Deshalb erhalten Sie einen Fehler.
Um es zu beheben, sollten Sie die Oberfläche im Callback SurfaceTextureDestroyed zurücksetzen. Wenn Sie fortfahren, bauen Sie die Oberfläche im Callback SurfaceTextureAvailable neu auf, legen Sie sie auf mediaPlayer fest und rufen Sie start to play auf. Die Codes gehen so:
%Vor%Und Sie müssen den Media Player überhaupt nicht zurücksetzen. Wenn Sie es zurücksetzen, müssen Sie es erneut instanziieren und erneut puffern, was zu Verzögerungen führt. Dies schadet der Benutzererfahrung, da keine verzögerte Pause / Fortsetzung mehr erwünscht ist.
Ich finde setSurface(null)
ist nützlich.
Wenn Sie eine TextureView verwenden, um etwas anzuzeigen, wenn TextureView.SurfaceTextureListener
callback onSurfaceTextureDestroyed
aufgerufen wurde, müssen Sie die Verwendung von SurfaceTexture/new Surface(SurfaceTexture)
binded von camera2
, MediaCodec
oder MediaPlayer
beenden.
So
%Vor%Tags und Links android video surfaceview activity-lifecycle textureview