[Android] La caméra, la prévisualisation [FRENCH]

Dans cette leçon, vous allez apprendre à contrôler la prévisualisation de la caméra.

Pour cela, vous allez utiliser les classes Camera et SurfaceView.

Ouvrez la caméra puis attachez la caméra au SurfaceHolder avec la méthode setPreviewDisplay().

Camera camera = Camera.open();
camera.setPreviewDisplay(surfaceHolder);

En cas de changement (orientation, …), changez la taille de prévisualisation avec la méthode setPreviewSize() et réactivez l’affichage avec la méthode startPreview().

Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(w, h);
camera.setParameters(parameters);
camera.startPreview();

A la fin, arrêtez l’affichage avec la méthode stopPreview().

camera.stopPreview();

Créez un SurfaceHolder étendant SurfaceView et implémentant Callback.

class Preview extends SurfaceView implements SurfaceHolder.Callback

Récupérez une référence au holder avec la méthode getHolder().

SurfaceHolder surfaceHolder = getHolder();

Sélectionnez le type de buffer par push SURFACE_TYPE_PUSH_BUFFERS avec la méthode setType().

surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

Créez les callback surfaceCreated(), surfaceDestroyed() et surfaceChanged().

surfaceHolder.addCallback(this);
public void surfaceCreated(SurfaceHolder holder) { /* setPreviewDisplay */ }
public void surfaceDestroyed(SurfaceHolder holder) { /* stopPreview */ }
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
  // setPreviewSize et startPreview
}

Layout main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
</LinearLayout>

Fichier Main.java

public class Main extends Activity {    
  private Preview preview;
    
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        preview = new Preview(this);
        setContentView(preview);
  }
}

Fichier Preview.java

class Preview extends SurfaceView implements SurfaceHolder.Callback {
    
    SurfaceHolder surfaceHolder;
    Camera camera;
    
    Preview(Context context) {
      super(context);
      surfaceHolder = getHolder();
      surfaceHolder.addCallback(this);
      surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
      camera = Camera.open();
        try {
          camera.setPreviewDisplay(surfaceHolder);
      } catch (IOException e) {
      }
    }
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
      camera.stopPreview();
      camera = null;
    }
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
      Camera.Parameters parameters = camera.getParameters();
      parameters.setPreviewSize(w, h);
      camera.setParameters(parameters);
      camera.startPreview();
    }
}

Projet AndroidManifest.xml

<uses-permission android:name="android.permission.CAMERA" />

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×