mklimek / frame-video-view

Less issues with VideoView
Other
63 stars 19 forks source link

Video URI needs to be provided on initialization #7

Closed m-kubis closed 8 years ago

m-kubis commented 8 years ago

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

mklimek commented 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.

m-kubis commented 8 years ago

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.

mklimek commented 8 years ago

@HorstFuchs Check 1.2.2 version :)

m-kubis commented 8 years ago

Looking good now. Thanks a lot :)

m-kubis commented 8 years ago

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) 

mklimek commented 8 years ago

@HorstFuchs You have to call setup in order to perform onPause or onResume on FrameVideoView.

m-kubis commented 8 years ago

I know, but I guess logging that instead of crashing would be cleaner. Anyway, thanks for the library and the quick responses!