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 que debería ser capaz de capturar la imagen de un hilo o de un servicio, sin perturbar la aplicación de primer plano, donde no quiero mostrar la cámara Vista previa, pero todavía quiero capturar la imagen en segundo plano y almacenarla en el dispositivo

Pruebe este código. Hacer clic en una imagen cuando se inicie 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 respuesta aceptada para trabajar dentro de mi actividad principal (funcionó como una actividad separada cuando cambié la vista de la superficie a 1dpi por 1dpi, pero después de tomar la foto, mis puntos de vista dinámicos desaparecerían).

Para tomar fotos sin vista previa en mi actividad principal, he utilizado el código de Android – Tome fotos sin vista previa (la versión modificada sigue).

 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"); } }; 

Puede utilizar 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 soporte de superficie (previewHolder)

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

Y luego usar el marcador de vista previa en la configuración de la vista previa en mediarecoreder.

  mediaRecorder.setPreviewDisplay(previewHolder.getSurface()); 

Este método tendrá una vista previa de pantalla en negro. Esto funciona para mí, espero que esto ayude …

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

CameraPreview_holderLL.setAlpha (255); // activar vista previa

CameraPreview_holderLL.setAlpha (0); // deshabilitar vista previa

 <LinearLayout android:id="@+id/camera_preview_holder" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:orientation="vertical" > </LinearLayout> </LinearLayout> 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.