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; } } [/java] <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);