Sur Android 4.0 et au-dessus de l'API (niveau >= 14), vous pouvez utiliser TextureView pour prévisualiser le flux d'une caméra et de le rendre invisible afin de ne pas le montrer à l'utilisateur. Voici comment:
D'abord créer une classe pour mettre en œuvre un SurfaceTextureListener qui obtiendra le créer/mettre à jour des rappels pour la preview de la surface. Cette classe prend également un appareil photo de l'objet en tant qu'entrée, de sorte qu'il peut appeler la caméra startPreview fonction dès que la surface est créée:
public class CamPreview extends TextureView implements SurfaceTextureListener {
private Camera mCamera;
public CamPreview(Context context, Camera camera) {
super(context);
mCamera = camera;
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Camera.Size previewSize = mCamera.getParameters().getPreviewSize();
setLayoutParams(new FrameLayout.LayoutParams(
previewSize.width, previewSize.height, Gravity.CENTER));
try{
mCamera.setPreviewTexture(surface);
} catch (IOException t) {}
mCamera.startPreview();
this.setVisibility(INVISIBLE); // Make the surface invisible as soon as it is created
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
// Put code here to handle texture size change if you want to
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
// Update your view here!
}
}
Vous aurez également besoin de mettre en œuvre une classe de rappel pour traiter les données d'aperçu:
public class CamCallback implements Camera.PreviewCallback{
public void onPreviewFrame(byte[] data, Camera camera){
// Process the camera data here
}
}
Le CamPreview et CamCallback classes d'installation de la caméra dans votre activité est onCreate() ou similaire fonction de démarrage:
// Setup the camera and the preview object
Camera mCamera = Camera.open(0);
CamPreview camPreview = new CamPreview(Context,mCamera);
camPreview.setSurfaceTextureListener(camPreview);
// Connect the preview object to a FrameLayout in your UI
// You'll have to create a FrameLayout object in your UI to place this preview in
FrameLayout preview = (FrameLayout) findViewById(R.id.cameraView);
preview.addView(camPreview);
// Attach a callback for preview
CamCallback camCallback = new CamCallback();
mCamera.setPreviewCallback(camCallback);