2012-03-16 24 views
23

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

+2

¿Has visto estas otras preguntas? http://stackoverflow.com/questions/2386025/android-camera-without-preview http://stackoverflow.com/questions/7398897/how-to-use-camera-to-take-picture-in-a-background -service-on-android –

+0

cualquier programa de ejemplo para dar uso de cámara frontal sin vista previa y guardar tarjeta sd – city0666

Respuesta

12

Pruebe 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

+0

Esto está en el camino correcto, pero está utilizando una 'Actividad' en lugar de un hilo de fondo o servicio. – Sam

+0

¡Esto toma una foto, pero se gira 90 grados! Para verificar, hice que la superficie fuera de 200x200 píxeles en lugar de 0 de ancho. La vista de superficie también muestra la imagen de lado. – Raja

1

se puede utilizar un maniquí 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 surfaceholder (previewHolder)

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

y luego usar el previewholder en la configuración de la vista previa en mediarecoreder.

mediaRecorder.setPreviewDisplay(previewHolder.getSurface()); 

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

3

no pude ser aceptado para trabajar en 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 foto, mis vistas dinámicas desaparecerían).

para tomar fotos sin previsualización en mi actividad principal, he usado el código de Android - Take picture without preview (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"); 
     } 
    }; 
+1

excepción de puntero nulo en esta línea myCamera.setPreviewDisplay (mview.getHolder()); –

1

Hacer la vista previa dentro de otro diseño lineal y cambiar el alfa valores 255 completa transparente llena 0 opaca

cameraPreview_holderLL.setAlpha (255); // habilitar la 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> 
Cuestiones relacionadas