Android IllegalArgumentException lockCanvas ()

He estado luchando con esta excepción y he mirado alrededor, pero no hay nada que me ayude.

Aquí está el código

package com.example.surfacetest; import android.app.Activity; import android.content.Context; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.Surface.OutOfResourcesException; import android.view.SurfaceHolder; import android.view.SurfaceView; public class BoardSurfaceActivity extends Activity { /** Called when the activity is first created. */ private static final String TAG = BoardSurfaceActivity.class.getSimpleName(); private BoardSurface bS; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); bS = new BoardSurface(this); setContentView(bS); Log.d(TAG, "View added"); } @Override protected void onDestroy() { Log.d(TAG, "Destroying..."); super.onDestroy(); } @Override protected void onStop() { Log.d(TAG, "Stopping..."); super.onStop(); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); } @Override protected void onPause() { Log.d(TAG, "Pausing..."); super.onPause(); } @Override protected void onResume() { Log.d(TAG, "Resuming..."); super.onResume(); } public class BoardSurface extends SurfaceView implements SurfaceHolder.Callback, Runnable { final String TAG = BoardSurface.class.getSimpleName(); private Stuff stuff; Thread t = null; SurfaceHolder holder; boolean isItOk = false; public BoardSurface(Context context) { super(context); holder = getHolder(); getHolder().addCallback(this); stuff = new Stuff(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), 50, 50); t = new Thread(this); setFocusable(true); } @Override public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG, "Surface created"); resume(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d(TAG, "Surface Destroyed"); pause(); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // delegating event handling to the droid stuff.handleActionDown((int) event.getX(), (int) event.getY()); // check if in the lower part of the screen we exit if (event.getY() > getHeight() - 50) { ((Activity) getContext()).finish(); } else { Log.d(TAG, "Coords: x=" + event.getX() + ",y=" + event.getY()); } } if (event.getAction() == MotionEvent.ACTION_MOVE) { // the gestures if (stuff.isTouched()) { // the droid was picked up and is being dragged stuff.setX((int) event.getX()); stuff.setY((int) event.getY()); } } if (event.getAction() == MotionEvent.ACTION_UP) { // touch was released if (stuff.isTouched()) { stuff.setTouched(false); } } return true; } public void draw(Canvas canvas) { canvas.drawColor(Color.BLUE); stuff.draw(canvas); } @Override public void run() { while (isItOk) { holder = getHolder(); if (holder.getSurface().isValid()) { Canvas c = null; try { // make sure holder is updated c = holder.lockCanvas(null); if (c != null) { synchronized (holder) { draw(c); } } } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (c != null) { holder.unlockCanvasAndPost(c); } } } } } public void pause() { isItOk = false; while (true) { try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } break; } t = null; } public void resume() { if (t.getState() == Thread.State.TERMINATED) { t = new Thread(this); isItOk = true; t.start(); } else { isItOk = true; t.start(); } } } } 

Lo que es extraño es que tengo este rastro:

 10-22 08:54:41.153: D/BoardSurface(17298): Surface created 10-22 08:54:41.394: E/memalloc(17298): /dev/pmem: Failed to map buffer size:24641536 offset:23699456 fd:56 Error: Invalid argument 10-22 08:54:41.394: E/gralloc(17298): Could not mmap handle 0x89e2b8, fd=56 (Invalid argument) 10-22 08:54:41.394: E/gralloc(17298): gralloc_register_buffer: gralloc_map failed 10-22 08:54:41.394: W/GraphicBufferMapper(17298): registerBuffer(0x89e2b8) failed -22 (Invalid argument) 10-22 08:54:41.394: E/GraphicBuffer(17298): unflatten: registerBuffer failed: Invalid argument (-22) 10-22 08:54:41.394: E/memalloc(17298): /dev/pmem: Failed to map buffer size:24641536 offset:23699456 fd:56 Error: Invalid argument 10-22 08:54:41.394: E/gralloc(17298): Could not mmap handle 0x89e2b8, fd=56 (Invalid argument) 10-22 08:54:41.394: E/libgenlock(17298): perform_lock_unlock_operation: GENLOCK_IOC_DREADLOCK failed (lockType0x1,err=Bad file number fd=56) 10-22 08:54:41.394: E/gralloc(17298): gralloc_lock: genlock_lock_buffer (lockType=0x2) failed 10-22 08:54:41.394: W/GraphicBufferMapper(17298): lock(...) failed -22 (Invalid argument) 10-22 08:54:41.394: W/Surface(17298): failed locking buffer (handle = 0x89e2b8) 10-22 08:54:41.424: E/SurfaceHolder(17298): Exception locking surface 10-22 08:54:41.424: E/SurfaceHolder(17298): java.lang.IllegalArgumentException 10-22 08:54:41.424: E/SurfaceHolder(17298): at android.view.Surface.nativeLockCanvas(Native Method) 10-22 08:54:41.424: E/SurfaceHolder(17298): at android.view.Surface.lockCanvas(Surface.java:236) 10-22 08:54:41.424: E/SurfaceHolder(17298): at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:807) 10-22 08:54:41.424: E/SurfaceHolder(17298): at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:787) 10-22 08:54:41.424: E/SurfaceHolder(17298): at com.example.surfacetest.BoardSurfaceActivity$BoardSurface.run(BoardSurfaceActivity.java:137) 10-22 08:54:41.424: E/SurfaceHolder(17298): at java.lang.Thread.run(Thread.java:841) 

En mi bucle de ejecución.

Pero aquí está la parte difícil! Cuando presiono de nuevo (no HOME), reinicie la aplicación desde el menú. Simplemente funciona.

Así que realmente no sé lo que estoy perdiendo.

Información adicional: Estoy corriendo en un HTC Sensation XE, CM 10.2 (Android 4.3.1)

EDITAR:

El dispositivo no es el problema aquí. Intentado con otro HTC en la ROM común.

EDIT 2:

Aunque compruebo:

 if (holder.getSurface().isValid()) 

Lo que está diciendo específicamente que lockcanvas () tendrá éxito si es cierto, recibo esta excepción

 10-22 10:11:27.688: E/SurfaceHolder(22195): Exception locking surface 10-22 10:11:27.688: E/SurfaceHolder(22195): java.lang.IllegalArgumentException 10-22 10:11:27.688: E/SurfaceHolder(22195): at android.view.Surface.nativeLockCanvas(Native Method) 10-22 10:11:27.688: E/SurfaceHolder(22195): at android.view.Surface.lockCanvas(Surface.java:236) 10-22 10:11:27.688: E/SurfaceHolder(22195): at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:807) 10-22 10:11:27.688: E/SurfaceHolder(22195): at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:787) 10-22 10:11:27.688: E/SurfaceHolder(22195): at com.example.surfacetest.BoardSurfaceActivity$BoardSurface.run(BoardSurfaceActivity.java:144) 10-22 10:11:27.688: E/SurfaceHolder(22195): at java.lang.Thread.run(Thread.java:841) 

EDIT 3:

Funciona en la ROM de inventario y el emulador de Galaxy S4 Intelx86 4.2.2

One Solution collect form web for “Android IllegalArgumentException lockCanvas ()”

@CinetiK: Publica el resto de tu stacktrace.

HTC dispositivos son notorios cuando se trata de rotación y pruebas de superficie. ¿Has probado esto:

  1. Reinicie el teléfono.

  2. Vaya a modo a prueba de errores (es decir, reinicie el teléfono y cuando vea el logotipo de HTC, presione el botón de volumen hacia abajo). El teléfono se reiniciará de nuevo y entrará en modo a prueba de fallos.

  3. Una vez que el teléfono esté en modo a prueba de errores, vaya a Configuración | Exhibición y Gestos | Calibración del sensor G. A continuación, calibre el teléfono mientras asegura que su teléfono repose sobre una superficie plana. Una vez que la calibración se haya completado correctamente, reinicie el teléfono en modo normal.

Si los pasos anteriores aún no solucionan el error, y ya que está usando CM 10.2 , recomendaría probar su aplicación de Android en ROMs de stock primero. Mientras que no tengo nada contra las ROMs de encargo del androide (las utilicé yo mismo), de la experiencia he tenido errores más inexplicados en ROMs de encargo que ROMs comunes. Intente una ROM común primero y vea si usted todavía consigue el mismo error.

  • Android: creación de un mapa de bits con contenido de SurfaceView
  • Android Cámara de visión de superficie cámara recreada cuando presiono botón de nuevo en la tableta de Archos en jellybean
  • Cámara de conmutación de adelante hacia atrás en pjsip android
  • ¿Cómo utilizar el feed de cámara en vivo como un fondo de actividad?
  • Grafika's CameraCaptureActivity - vista previa de la cámara distorsionada en vista previa tamaño cambiar
  • Malo rendimiento al dibujar continuamente en CustomView
  • Android translate ImageView sobre SurfaceView
  • ¿Debería el renderingThread de un SurfaceView tener el mismo ciclo de vida que la vista o la actividad?
  • Combinación de SurfaceView con otras vistas, como TextView y botones
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.