Zoom Camera in SurfaceView-Preview

24,875

Solution 1

import android.content.Context;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CustomCameraView extends SurfaceView
{
    Camera camera;
    SurfaceHolder previewHolder;

    public void zoom()
    {
        Parameters params=camera.getParameters();
        params.setZoom(params.getMaxZoom());
        camera.setParameters(params);   
    }

    public void unzoom()
    {
        Parameters params=camera.getParameters();
        params.setZoom(0);
        camera.setParameters(params);
    }

    public CustomCameraView(Context context) 
    {
        super(context);
        previewHolder=this.getHolder();
        previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        SurfaceHolder.Callback surfaceHolderListener=new SurfaceHolder.Callback()
        {
            public void surfaceCreated(SurfaceHolder holder) 
            {
                camera=Camera.open();
                try{
                    camera.setPreviewDisplay(previewHolder);
                }
                catch (Exception e) {
                }
            }

            public void surfaceChanged(SurfaceHolder holder, int format,
                    int width, int height) {
                Parameters params=camera.getParameters();
                params.setPreviewSize(width, height);
                params.setPictureFormat(PixelFormat.JPEG);

                //if you want the preview to be zoomed from start :
                params.setZoom(params.getMaxZoom());

                camera.setParameters(params);
                camera.startPreview();
            }

            public void surfaceDestroyed(SurfaceHolder holder) {
                camera.stopPreview();
                camera.release();
            }
        };
        previewHolder.addCallback(surfaceHolderListener);
    }

}

Solution 2

if (params.isZoomSupported()) {
    final int maxZoomLevel = params.getMaxZoom();
    Log.i("max ZOOM ", "is " + maxZoomLevel);
    zoomControls.setIsZoomInEnabled(true);
    zoomControls.setIsZoomOutEnabled(true);

    zoomControls.setOnZoomInClickListener(new OnClickListener(){
        public void onClick(View v){
            if(currentZoomLevel < maxZoomLevel){
                currentZoomLevel++;
                //mCamera.startSmoothZoom(currentZoomLevel);
                params.setZoom(currentZoomLevel);
                mCamera.setParameters(params);
            }
        }
    });

    zoomControls.setOnZoomOutClickListener(new OnClickListener(){
        public void onClick(View v){
            if(currentZoomLevel > 0){
                currentZoomLevel--;
                params.setZoom(currentZoomLevel);
                mCamera.setParameters(params);
            }
        }
    });    
}
else
    zoomControls.setVisibility(View.GONE);

Solution 3

What phone are you using? I'm developing an app that uses the camera and all the device's I've tested on behave differently. I can post a test app if you want. http://www.mediafire.com/?laxtolevt57vax2

Here is a link to a test app I've been working with. I've made many changes to make to work on multiple phones. It's still far from perfect, but zoom works. I've tested on Samsung Galaxy s2, Droid X, Droid Bionic, Droid 2, LG Ally. It does not work on a HTC Sensation. getMaxZoom() returns zero. It also doesn't work on the HTC Incredible 2. The AutoFocusCallback is never executed and the application hangs, and locks up the camera.

Share:
24,875
Tschakle
Author by

Tschakle

Updated on March 31, 2020

Comments

  • Tschakle
    Tschakle about 4 years

    I know the camera functions getMaxZoom(), isZoomSupported() or get/setZoom(). I can use these functions but nothing happens in my Surface-Camera-Preview. I want that my preview starts in zoom all time.I use Android 2.3.3. Do I forget something?!

    Code is:

    Camera.Parameters parameters = camera.getParameters();
    if(parameters.isZoomSupported())
              {
                  int maxZoom= parameters.getMaxZoom();
                  parameters.setZoom(maxZoom);
                  camera.setParameters(parameters);
              }
    

    Hope anybody has an idea...

    Thanks!

  • Aditya Pawade
    Aditya Pawade almost 12 years
    The zoom worked even though The parameters.isZoomSupported() returned false
  • Ivar
    Ivar over 6 years
    Down-voted because answer should have solution without the need to follow links. BTW link is dead now.