2011-12-24 3 views
1

J'essaie de dessiner quelque chose sur l'aperçu de la caméra. Mais lorsque le programme appelle la méthode startPreview, il lance cette exception: java.lang.RuntimeException: startPreview a échoué.Aperçu de la caméra Android avec vue de la surface

Mon code:

public class ScanView extends SurfaceView implements SurfaceHolder.Callback { 

private MySurfaceThread thread; 

Camera camera; 

Context context; 

private boolean inPreview = false; 

public class MySurfaceThread extends Thread { 

    private SurfaceHolder myThreadSurfaceHolder; 
    private ScanView myThreadSurfaceView; 
    private boolean myThreadRun = false; 

    public MySurfaceThread(SurfaceHolder surfaceHolder, ScanView surfaceView) { 
     myThreadSurfaceHolder = surfaceHolder; 
     myThreadSurfaceView = surfaceView; 
    } 

    public void setRunning(boolean b) { 
     myThreadRun = b; 
    } 

    @Override 
    public void run() { 

     while (myThreadRun) { 
      Canvas c = null; 
      try { 
       c = myThreadSurfaceHolder.lockCanvas(null); 
       synchronized (myThreadSurfaceHolder) { 

        myThreadSurfaceView.onDraw(c); 
       } 
      } finally { 
       if (c != null) { 
        myThreadSurfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 
    } 
} 

@Override 
protected void onDraw(Canvas canvas) { 

} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    return true; 
} 

public ScanView(Context context) { 
    super(context); 

    this.context = context; 
    init(); 
} 

private void init() { 
    getHolder().addCallback(this); 
    thread = new MySurfaceThread(getHolder(), this); 


    setFocusable(true); // make sure we get key events 

} 

public void surfaceChanged(SurfaceHolder arg0, int format, int width, int height) { 

    ((Activity)context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    this. 

    camera.setDisplayOrientation(90); 
    camera.startPreview(); 
    inPreview = true; 
} 

public void surfaceCreated(SurfaceHolder arg0) { 
    thread.setRunning(true); 
    thread.start(); 

    try { 
     camera.setPreviewDisplay(this.getHolder()); 
    } catch (Throwable t) { 
    } 
} 

public void surfaceDestroyed(SurfaceHolder arg0) { 

    boolean retry = true; 
    thread.setRunning(false); 
    while (retry) { 
     try { 
      thread.join(); 
      retry = false; 
     } catch (InterruptedException e) { 
     } 
    } 
} 

public void onPause() { 
    if (inPreview) { 
     camera.stopPreview(); 
    } 

    camera.release(); 
    camera = null; 
    inPreview = false; 

} 

public void onResume() { 
    camera = Camera.open(); 
} 
} 

Comment dois-je faire?

Répondre

0

La caméra d'Android est très spécifique dans sa commande. Voir here et suivez-le étape par étape. Personnellement, je dépiste de son état de démarrage/arrêt.

if (_previewRunning) camera.stopPreview(); 
[...] 
camera.startPreview(); 
0

Vous ne pouvez pas être sûr que surfaceChanged() n'est appelée qu'une seule fois. Donc, camera.startPreview(); peut également être appelé quelques fois là-bas. Ce n'est pas correct.

Questions connexes