Android Camera Sample

Android Camera Sample

Requirements

  • Not use external Intent(Call Camera API)
  • Use preview(cover all view)

Sample

View xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <SurfaceView
        android:id="@+id/camera"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

UI is just SurfaceView.
SurfaceView is used for Camera Preview.
Camera view is displayed on time

Code

public class CameraActivity extends AppCompatActivity {

    private SurfaceView surfaceView;

    private Camera camera;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);

        surfaceView = (SurfaceView)findViewById(R.id.camera);

        surfaceView.setOnClickListener(new ClickSurfaceListener());

        SurfaceHolder holder = surfaceView.getHolder();
        holder.addCallback(new SurfaceCallback());
    }

    // Callback
    private class SurfaceCallback implements SurfaceHolder.Callback {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // Camera open
            camera = Camera.open();

            // Portrait
            camera.setDisplayOrientation(90);
            // Set output to Surface
            try {
                camera.setPreviewDisplay(holder);
            }
            catch (IOException oops) {
                oops.printStackTrace();
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            // Get camera sizes
            Camera.Parameters params = camera.getParameters();
            List<Camera.Size> sizes = params.getSupportedPreviewSizes();

            // Get optimal size
            Camera.Size optimalSize = getOptimalPreviewSize(sizes, width, height);
            params.setPreviewSize(optimalSize.width,optimalSize.height);
            camera.setParameters(params);

            // Start preview
            camera.startPreview();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // Release
            camera.release();
            camera = null;
        }
    }

    // Click SurfaceView
    private class ClickSurfaceListener implements View.OnClickListener {
        @Override
        public void onClick(View view){
            if (camera != null) {
                // AutoFocus
                camera.autoFocus(new AutoFocusListener());
            }
        }
    }

    // Autofocus callback
    private class AutoFocusListener implements  Camera.AutoFocusCallback {
        @Override
        public void onAutoFocus(boolean success, Camera camera) {

            //camera.takePicture();
            camera.setOneShotPreviewCallback(new OneShotPreviewListener());
        }
    }

    // OneshotPreview callback
    private class OneShotPreviewListener implements Camera.PreviewCallback {
        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {

            Bitmap bmp = ImageUtils.getBitmapImageFromYUV(data, camera, 80);

            Matrix m = new Matrix();
            m.setRotate(90);
            Bitmap rotated_bmp = Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),m,true);

            // Save image?
            String uri = MediaStore.Images.Media.insertImage(getContentResolver(), rotated_bmp, "", null);

            Toast.makeText(getApplicationContext(), "Pick Picture", Toast.LENGTH_SHORT).show();
        }
    }

    // Get optmize preview size
    private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
        if (sizes == null) return null;

        final double ASPECT_TOLERANCE = 0.1;
        double targetRatio=(double)h / w;

        Camera.Size optimalSize = null;
        double mindiff = Double.MAX_VALUE;

        int targetHeight = h;

        for (Camera.Size size : sizes) {
            double ratio = (double) size.width / size.height;
            if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
            if (Math.abs(size.height - targetHeight) < mindiff) {
                optimalSize = size;
                mindiff = Math.abs(size.height - targetHeight);
            }
        }

        if (optimalSize == null) {
            mindiff = Double.MAX_VALUE;
            for (Camera.Size size : sizes) {
                if (Math.abs(size.height - targetHeight) < mindiff) {
                    optimalSize = size;
                    mindiff = Math.abs(size.height - targetHeight);
                }
            }
        }
        return optimalSize;
    }
}
&#91;/java&#93;


<h3>Flash</h3>
<strong>On</strong>
[java]
Camera.Parameters params = camera.getParameters();
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);

camera is android.hardware.Camera instance.
Off

Camera.Parameters params = camera.getParameters();
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(params);