cómo tomar la captura de la cámara sin una vista previa de un servicio o hilo?

¿Es posible capturar una imagen sin mostrar la vista previa de la cámara ?, tengo un requisito de que debería ser capaz de capturar la imagen desde un hilo o desde un servicio, sin molestar a la aplicación en primer plano, donde no quiero mostrar la cámara vista previa, pero aún así quiero capturar la imagen en segundo plano y almacenarla en el dispositivo

Prueba este código Hará clic en una imagen cuando comience la actividad. Tiene una vista previa, pero el tamaño de vista previa se establece en 0 por 0 dp.

package fortyonepost.com.pwop; import java.io.IOException; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.ImageView; public class TakePicture extends Activity implements SurfaceHolder.Callback { //a variable to store a reference to the Image View at the main.xml file private ImageView iv_image; //a variable to store a reference to the Surface View at the main.xml file private SurfaceView sv; //a bitmap to display the captured image private Bitmap bmp; //Camera variables //a surface holder private SurfaceHolder sHolder; //a variable to control the camera private Camera mCamera; //the camera parameters private Parameters parameters; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //get the Image View at the main.xml file iv_image = (ImageView) findViewById(R.id.imageView); //get the Surface View at the main.xml file sv = (SurfaceView) findViewById(R.id.surfaceView); //Get a surface sHolder = sv.getHolder(); //add the callback interface methods defined below as the Surface View callbacks sHolder.addCallback(this); //tells Android that this surface will have its data constantly replaced sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { //get camera parameters parameters = mCamera.getParameters(); //set camera parameters mCamera.setParameters(parameters); mCamera.startPreview(); //sets what code should be executed after the picture is taken Camera.PictureCallback mCall = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { //decode the data obtained by the camera into a Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length); //set the iv_image iv_image.setImageBitmap(bmp); } }; mCamera.takePicture(null, null, mCall); } @Override public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, acquire the camera and tell it where // to draw the preview. mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); } catch (IOException exception) { mCamera.release(); mCamera = null; } } @Override public void surfaceDestroyed(SurfaceHolder holder) { //stop the preview mCamera.stopPreview(); //release the camera mCamera.release(); //unbind the camera from this object mCamera = null; } } 

referencia: http://www.41post.com/3794/programming/android-take-a-picture-without-displaying-a-preview

No pude obtener una respuesta aceptada para trabajar dentro de mi actividad principal (funcionó como una actividad separada cuando cambié la vista de superficie a 1 ppp por 1 ppp, pero después de tomar la foto, desaparecían mis vistas dinámicas).

para tomar una foto sin vista previa en mi actividad principal, utilicé el código de Android: tome una foto sin vista previa (sigue la versión modificada).

 private SurfaceView sv; Camera myCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); 

 private void takePhoto() { Camera.Parameters parameters = myCamera.getParameters(); // myCamera.setDisplayOrientation(180); // parameters.setPictureFormat(ImageFormat.JPEG); // parameters.setPictureFormat(PixelFormat.JPEG); myCamera.setParameters(parameters); SurfaceView mview = sv; try { myCamera.setPreviewDisplay(mview.getHolder()); myCamera.startPreview(); myCamera.takePicture(null, null, photoCallback); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Camera.PictureCallback photoCallback=new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { saveMyPhotoToParse(data); // Log.i(DEBUG_TAG,"image pseudo saved"); } }; 

Haga la vista previa dentro de otro diseño lineal y cambie los valores alfa 255 completo transparente 0 opaco completo

cameraPreview_holderLL.setAlpha (255); // habilitar vista previa

cameraPreview_holderLL.setAlpha (0); // desactivar vista previa

     

puedes usar un dummy surfaceholder.callback

 private SurfaceHolder.Callback dummySurfaceCallback = new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { // do nothing } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // do nothing } @Override public void surfaceDestroyed(SurfaceHolder holder) { // do nothing } }; 

y aplicarlo a un titular de superficie (previewHolder)

  preview = (SurfaceView) findViewById(R.id.preview); previewHolder = preview.getHolder(); previewHolder.addCallback(dummySurfaceCallback); previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

y luego use el reproductor de vista previa para configurar la vista previa en mediarecoreder.

  mediaRecorder.setPreviewDisplay(previewHolder.getSurface()); 

este método tendrá una vista previa en pantalla negra. esto funciona para mí, espero que esto ayude …