Closed m-kubis closed 8 years ago
@HorstFuchs I released a new version 1.2.1 with a fix to this issue. Let me know whether it works or not.
Awesome. That did it. Thanks.
One more thing though, if I want to change the URI after the first one has been set, I get
04-08 08:01:29.298 9688-9688/com.example.mkubis.playground E/TextureViewImpl: cannot prepare media player with SurfaceTexture java.lang.IllegalStateException at android.media.MediaPlayer._prepare(Native Method) at android.media.MediaPlayer.prepare(MediaPlayer.java:1158) at com.mklimek.frameviedoview.TextureViewImpl.prepare(TextureViewImpl.java:83) at com.mklimek.frameviedoview.TextureViewImpl.init(TextureViewImpl.java:48) at com.mklimek.frameviedoview.FrameVideoView.setup(FrameVideoView.java:74) at com.example.mkubis.playground.ActivityMain$2.onClick(ActivityMain.java:36) at android.view.View.performClick(View.java:5204) at android.view.View$PerformClick.run(View.java:21153) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Looks like the MediaPlayer needs to be released before reinitialization in TextureViewImpl#prepare().
I have no old device around to check the VideoView flow.
@HorstFuchs Check 1.2.2 version :)
Looking good now. Thanks a lot :)
I have just noticed. If I do not call setup(URI) (or anything that inits the video implementation) at initialization, I get a different crash:
04-11 12:10:09.712 14101-14101/com.example.mkubis.playground E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.mkubis.playground, PID: 14101 java.lang.RuntimeException: Unable to pause activity {com.example.mkubis.playground/com.example.mkubis.playground.ActivityMain}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setVisibility(int)' on a null object reference at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3381) at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3340) at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3315) at android.app.ActivityThread.-wrap13(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setVisibility(int)' on a null object reference at com.mklimek.frameviedoview.TextureViewImpl.onPause(TextureViewImpl.java:128) at com.mklimek.frameviedoview.FrameVideoView.onPause(FrameVideoView.java:106) at com.example.mkubis.playground.ActivityMain.onPause(ActivityMain.java:67) at android.app.Activity.performPause(Activity.java:6363) at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1311) at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3367) at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3340) at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3315) at android.app.ActivityThread.-wrap13(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
@HorstFuchs You have to call setup in order to perform onPause or onResume on FrameVideoView.
I know, but I guess logging that instead of crashing would be cleaner. Anyway, thanks for the library and the quick responses!
If the video URI is set after a delay or on a user action rather than right after initialization, the surface texture gets ready and an exception is thrown in TextureViewImpl.prepare(). It is handled, but the video cannot be run any more, no callbacks.
04-07 16:43:48.859 22584-22584/? E/TextureViewImpl: cannot prepare media player with SurfaceTexture java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference at android.media.MediaPlayer.setDataSource(MediaPlayer.java:985) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:968) at com.mklimek.frameviedoview.TextureViewImpl.prepare(TextureViewImpl.java:72) at com.mklimek.frameviedoview.TextureViewImpl.onSurfaceTextureAvailable(TextureViewImpl.java:66) at android.view.TextureView.getHardwareLayer(TextureView.java:368) at android.view.View.updateDisplayListIfDirty(View.java:15157) at android.view.View.draw(View.java:15954) at android.view.ViewGroup.drawChild(ViewGroup.java:3609) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) at android.view.View.updateDisplayListIfDirty(View.java:15175) at android.view.View.draw(View.java:15954) at android.view.ViewGroup.drawChild(ViewGroup.java:3609) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) at android.view.View.updateDisplayListIfDirty(View.java:15175) at android.view.View.draw(View.java:15954) at android.view.ViewGroup.drawChild(ViewGroup.java:3609) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) at android.view.View.updateDisplayListIfDirty(View.java:15175) at android.view.View.draw(View.java:15954) at android.view.ViewGroup.drawChild(ViewGroup.java:3609) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) at android.view.View.updateDisplayListIfDirty(View.java:15175) at android.view.View.draw(View.java:15954) at android.view.ViewGroup.drawChild(ViewGroup.java:3609) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) at android.view.View.draw(View.java:16187) at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690) at android.view.View.updateDisplayListIfDirty(View.java:15180) at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281) at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287) at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322) at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615) at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:606) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
If you have trouble reproducing, I can provide a code. Nexus6@6.0.1