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
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.
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
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"); } };
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With