2015-11-19 1 views
0

Я зову:класс Surface Android дает мне «уже подключен» ошибка, и IllegalArgumentException

mSurface.lockCanvas(null); 

Null является допустимым параметром дать lockCanvas, показывая, что весь экран должен быть обновлен.

Поверхность я использую, передается мне, и код, который получает он делает это через:

new Surface(mPlaybackView.getSurfaceTexture()); 

mPlaybackView является TextureView, который захватил из ресурсов. Когда lockCanvas (нуль), называется, я получаю следующее:

BufferQueueProducer: [unnamed-6903-1] connect(P): already connected (cur=3 req=2) 

и

java.lang.IllegalArgumentException at android.view.Surface.nativeLockCanvas (Native Method). 

Я нахожусь в тупик, так как я все еще учусь о холсте и поверхности и т.д.

ли здесь что-то явно не так?

Редактировать: Вот трассировка стека.

11-19 09:45:28.075 3319-3319/com.example.eschjen.nov15test D/Jenny: inside try, surface is: Surface([email protected])/@0x3bc8b489 
11-19 09:45:28.086 3319-3319/com.example.eschjen.nov15test E/BufferQueueProducer: [unnamed-3319-0] connect(P): already connected (cur=3 req=2) 
11-19 09:45:28.087 3319-3319/com.example.eschjen.nov15test E/Jenny: Exception caught: 
                    java.lang.IllegalArgumentException 
                     at android.view.Surface.nativeLockCanvas(Native Method) 
                     at android.view.Surface.lockCanvas(Surface.java:255) 
                     at com.example.eschjen.nov15test.MediaCodecWrapper.surfaceRender(MediaCodecWrapper.java:469) 
                     at com.example.eschjen.nov15test.MediaCodecWrapper.access$200(MediaCodecWrapper.java:41) 
                     at com.example.eschjen.nov15test.MediaCodecWrapper$1.outputSample(MediaCodecWrapper.java:338) 
                     at com.example.eschjen.nov15test.MediaCodecWrapper.popSampleJenny(MediaCodecWrapper.java:345) 
                     at com.example.eschjen.nov15test.MainActivity$1.onTimeUpdate(MainActivity.java:183) 
                     at android.animation.TimeAnimator.animationFrame(TimeAnimator.java:27) 
                     at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1248) 
                     at android.animation.ValueAnimator$AnimationHandler.doAnimationFrame(ValueAnimator.java:659) 
                     at android.animation.ValueAnimator$AnimationHandler.run(ValueAnimator.java:682) 
                     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
                     at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
                     at android.view.Choreographer.doFrame(Choreographer.java:549) 
                     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
                     at android.os.Handler.handleCallback(Handler.java:739) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:135) 
                     at android.app.ActivityThread.main(ActivityThread.java:5221) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at java.lang.reflect.Method.invoke(Method.java:372) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
11-19 09:45:28.087 3319-3319/com.example.eschjen.nov15test D/Jenny: done trying 
11-19 09:45:28.088 3319-3319/com.example.eschjen.nov15test D/Jenny: done being synchronized. 
+0

Не могли бы вы разместить полный стек tt – Henry

ответ

3

Я принимаю, что mPlaybackView является TextureView. Surface.lockCanvas(rect) может выбросить IllegalArgumentException, если прямоугольник «rect» недействителен.

Е/BufferQueueProducer: [безымянная-3319-0] соединить (Р): уже подключен (текущ = 3 REQ = 2)

От documentation в TextureView на:

SurfaceTexture TextureView может быть получен либо путем вызова getSurfaceTexture(), либо с помощью TextureView.SurfaceTextureListener. Важно знать, что SurfaceTexture доступен только после TextureView прикреплен к окну (а onAttachedToWindow() вызывается .) Поэтому настоятельно рекомендуется использовать прослушиватель , чтобы получать уведомление, когда SurfaceTexture становится доступным , Важно отметить, что только один производитель может использовать TextureView. Например, если вы используете TextureView для отображения предварительного просмотра камеры, вы не можете использовать lockCanvas() для рисования на TextureView одновременно.

Вы должны убедиться, что SurfaceTexture, связанный с этим TextureView доступен для рендеринга. Вы можете использовать TextureView.isAvailable(), чтобы подтвердить это.

+0

isAvailable() возвращает true. – Jenny

+0

Да. Но, похоже, ваша проблема здесь в том, что поверхность принадлежит другому производителю. Взгляните на это: http://developer.android.com/reference/android/view/TextureView.html#lockCanvas() – Henry

+0

* мышление *. Возможно, видеоплеер считает, что ему принадлежит представление текстуры. Я займусь этим проспектом. Однако ничего не отображается на экране, поэтому, если видеоплеер считает, что он владеет им, это неправильно. – Jenny

Смежные вопросы