Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to take camera capture without a preview from a service or thread?

Tags:

android

Is it possible to capture an image without showing the camera preview?, i have a requirement that i should be able to capture the image from a thread or from a service, without disturbing the foreground application, where i do not want to show the camera preview, but still i want to capture the image in background and store it in the device

like image 738
city0666 Avatar asked Mar 16 '12 21:03

city0666


People also ask

What is camera preview?

PreviewView is a subclass of FrameLayout . To display the camera feed, it uses either a SurfaceView or TextureView , provides a preview surface to the camera when it's ready, tries to keep it valid as long as the camera is using it, and when released prematurely, provides a new surface if the camera is still in use.


2 Answers

Try this code. It will click a picture when the activity starts up. It has a preview, but the preview size is set to 0 by 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;     } } 

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

like image 85
Arjun S Lal Avatar answered Sep 21 '22 20:09

Arjun S Lal


i could not get accepted answer to work within my main activity (it worked as a separate activity when i changed surface view to 1dpi by 1dpi, but after taking photo, my dynamic views would disappear).

to take photo without preview in my main activity, i used the code from Android - Take picture without preview (modified version follows).

...

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");         }     }; 
like image 29
tmr Avatar answered Sep 20 '22 20:09

tmr