2010-09-05 5 views
1

Je suis un programmeur débutant pour Android J'essayais de démarrer l'aperçu de la caméra dans Android sur le clic du bouton. J'essaie directement d'accéder au matériel de la caméra plutôt que d'utiliser l'application de caméra par défaut. Voici le code que j'ai écritImpossible de démarrer la caméra Aperçu sur le bouton cliquez sur

import android.app.Activity; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

public class CameraHandler extends Activity { 
    private SurfaceView sv = null; 
    private SurfaceHolder previewHolder = null; 

    private Button btnStop; 
    private Button btnStart; 
    private Camera camera = null; 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.cameraview); 

    // Get the surface view from main layout 
    sv = (SurfaceView) findViewById(R.id.cameraSurface); 

    // Get the buttons from XML 
    btnStart = (Button) findViewById(R.id.startButton); 
    btnStop = (Button) findViewById(R.id.stopButton); 



    btnStart.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
     // TODO Auto-generated method stub 

     SurfaceHolder.Callback surfaceCallBack = new SurfaceHolder.Callback() { 

      @Override 
      public void surfaceDestroyed(SurfaceHolder holder) { 
      // TODO Auto-generated method stub 

      camera.release(); 
      camera = null; 
      } 

      @Override 
      public void surfaceCreated(SurfaceHolder holder) { 
      // TODO Auto-generated method stub 
      camera = Camera.open(); 
      try { 
       camera.setPreviewDisplay(previewHolder); 
      } catch (Throwable t) { 
       // TODO Auto-generated catch block 
       Log.e("PreviewDemo-surfaceCallback", 
        "Exception in setPreviewDisplay()", t); 
       Toast.makeText(CameraHandler.this, t.getMessage(), 
        Toast.LENGTH_LONG).show(); 
      } 
      } 

      @Override 
      public void surfaceChanged(SurfaceHolder holder, 
       int format, int width, int height) { 
      // TODO Auto-generated method stub 
      Camera.Parameters parameters = camera.getParameters(); 
      parameters.setPreviewSize(width, height); 
      camera.setParameters(parameters); 
      camera.startPreview(); 

      } 
     }; 

     // Get the surface holder from the surface view 
     previewHolder = sv.getHolder(); 

     // Now add these call backs 
     previewHolder.addCallback(surfaceCallBack); 
     previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     } 
    }); 

    btnStop.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
     // TODO Auto-generated method stub 
     camera.stopPreview(); 
     } 
    }); 
    } 

} 

Comme vous pouvez le voir, je suis en train de superficiaire de la SurfaceView en XML ajoutant un rappel lorsque le bouton de démarrage est cliqué. Pour une raison quelconque, le rappel SufraceHolder n'est pas appelé. Mais si je place tout ce code directement dans la fonction OnCreate, cela fonctionne très bien. L'aperçu de la caméra commence dès que l'activité est lancée. Est-ce que j'ai râté quelque chose?

Merci à l'avance

Répondre

2

Le SurfaceView est déjà créé au moment où le bouton est cliqué. Par conséquent, surfaceCreated() ne sera probablement pas appelé.

+0

Oh .. Merci pour la réponse rapide. Hey est-il possible de réaliser cela, je veux dire commencer l'aperçu de la caméra en cliquant sur un bouton? – copyninja

+1

@Vasudev: appelez camera.startPreview() dans votre OnClickListener, mais faites d'abord le reste de l'installation. – CommonsWare

+0

cela a fonctionné! Merci beaucoup :) – copyninja

Questions connexes