Advertisement
Ronel101

Take pics - camera 2 api

Jul 30th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.79 KB | None | 0 0
  1. package com.example.ronel.newapp;
  2.  
  3. import android.Manifest;
  4. import android.content.Context;
  5. import android.content.pm.PackageManager;
  6. import android.graphics.ImageFormat;
  7. import android.graphics.SurfaceTexture;
  8. import android.hardware.camera2.CameraAccessException;
  9. import android.hardware.camera2.CameraCaptureSession;
  10. import android.hardware.camera2.CameraCharacteristics;
  11. import android.hardware.camera2.CameraDevice;
  12. import android.hardware.camera2.CameraManager;
  13. import android.hardware.camera2.CameraMetadata;
  14. import android.hardware.camera2.CaptureRequest;
  15. import android.hardware.camera2.TotalCaptureResult;
  16. import android.hardware.camera2.params.StreamConfigurationMap;
  17. import android.media.Image;
  18. import android.media.ImageReader;
  19. import android.os.Environment;
  20. import android.os.Handler;
  21. import android.os.HandlerThread;
  22. import android.provider.ContactsContract;
  23. import android.support.annotation.NonNull;
  24. import android.support.design.widget.FloatingActionButton;
  25. import android.support.v4.app.ActivityCompat;
  26. import android.support.v7.app.AppCompatActivity;
  27. import android.os.Bundle;
  28. import android.util.Size;
  29. import android.util.SparseIntArray;
  30. import android.view.Surface;
  31. import android.view.TextureView;
  32. import android.view.View;
  33. import android.widget.Toast;
  34.  
  35. import java.io.File;
  36. import java.io.FileNotFoundException;
  37. import java.io.FileOutputStream;
  38. import java.io.IOException;
  39. import java.io.OutputStream;
  40. import java.io.StreamCorruptedException;
  41. import java.nio.ByteBuffer;
  42. import java.util.ArrayList;
  43. import java.util.Arrays;
  44. import java.util.List;
  45. import java.util.UUID;
  46.  
  47. public class TakePics extends AppCompatActivity {
  48.  
  49.     FloatingActionButton floatingActionButton;
  50.     TextureView textureView;
  51.  
  52.     //Check state orientation of output image
  53.     private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
  54.     static {
  55.         ORIENTATIONS.append(Surface.ROTATION_0,90);
  56.         ORIENTATIONS.append(Surface.ROTATION_90,0);
  57.         ORIENTATIONS.append(Surface.ROTATION_180,270);
  58.         ORIENTATIONS.append(Surface.ROTATION_270,180);
  59.     }
  60.     private String cameraId;
  61.     private CameraDevice cameraDevice;
  62.     private CameraCaptureSession cameraCaptureSessions;
  63.     private CaptureRequest.Builder captureRequestBuilder;
  64.     private Size imageDimension;
  65.     private ImageReader imageReader;
  66.  
  67.     //Save to file
  68.     private File file;
  69.     private static final int REQUEST_CAMERA_PERMISSION = 200;
  70.     private boolean mFlashSupported;
  71.     private Handler mBackgroundHandler;
  72.     private HandlerThread mBackgroundThread;
  73.  
  74.     CameraDevice.StateCallback stateCallBack = new CameraDevice.StateCallback() {
  75.         @Override
  76.         public void onOpened(@NonNull CameraDevice camera) {
  77.             cameraDevice = camera;
  78.             createCameraPreview();
  79.         }
  80.  
  81.         @Override
  82.         public void onDisconnected(@NonNull CameraDevice camera) {
  83.             cameraDevice.close();
  84.         }
  85.  
  86.         @Override
  87.         public void onError(@NonNull CameraDevice camera, int error) {
  88.             cameraDevice.close();
  89.             cameraDevice = null;
  90.         }
  91.     }
  92.  
  93.     @Override
  94.     protected void onCreate(Bundle savedInstanceState) {
  95.         super.onCreate(savedInstanceState);
  96.         setContentView(R.layout.activity_take_pics);
  97.  
  98.         floatingActionButton = findViewById(R.id.floating);
  99.         textureView = findViewById(R.id.textureView);
  100.         assert textureView != null;
  101.         textureView.setSurfaceTextureListener(textureListener);
  102.  
  103.     }
  104.  
  105.     private void takePicture() {
  106.         if (cameraDevice == null)
  107.             return;
  108.         CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
  109.         try {
  110.             CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraDevice.getId());
  111.             Size[] jpegSizes = null;
  112.             if (characteristics != null)
  113.                 jpegSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
  114.                         .getOutputSizes(ImageFormat.JPEG);
  115.  
  116.             //Capture image with custom size
  117.             int width = 640;
  118.             int height = 480;
  119.             if (jpegSizes != null && jpegSizes.length > 0) {
  120.                 width = jpegSizes[0].getWidth();
  121.                 height = jpegSizes[0].getHeight();
  122.             }
  123.             ImageReader reader = ImageReader.newInstance(width,height,ImageFormat.JPEG,1);
  124.             List<Surface> outputSurface = new ArrayList<>(2);
  125.             outputSurface.add(reader.getSurface());
  126.             outputSurface.add(new Surface(textureView.getSurfaceTexture()));
  127.  
  128.             final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
  129.             captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
  130.  
  131.             //Check orientation base on device
  132.             int rotation = getWindowManager().getDefaultDisplay().getRotation();
  133.             captureBuilder.set(CaptureRequest.JPEG_ORIENTATION,ORIENTATIONS.get(rotation));
  134.  
  135.             file = new File(Environment.getExternalStorageDirectory()+"/"+ UUID.randomUUID().toString() + ".jpg");
  136.             ImageReader.OnImageAvailableListener readListener = new ImageReader.OnImageAvailableListener() {
  137.                 @Override
  138.                 public void onImageAvailable(ImageReader reader) {
  139.                     Image image = null;
  140.                     try {
  141.                         image = reader.acquireLatestImage();
  142.                         ByteBuffer buffer = image.getPlanes()[0].getBuffer();
  143.                         byte[] bytes = new byte[buffer.capacity()];
  144.                         buffer.get(bytes);
  145.                         save(bytes);
  146.                     }
  147.                     catch (FileNotFoundException e) {
  148.                         e.printStackTrace();
  149.                     }
  150.                     catch (IOException e) {
  151.                         e.printStackTrace();
  152.                     }
  153.                     finally {
  154.                         {
  155.                             if (image != null)
  156.                                 image.close();
  157.                         }
  158.                     }
  159.                 }
  160.                 private void save(byte[] bytes) throws IOException {
  161.                     OutputStream outputStream = null;
  162.                     try {
  163.                         outputStream = new FileOutputStream(file);
  164.                         outputStream.write(bytes);
  165.                     } finally {
  166.                         if (outputStream != null)
  167.                             outputStream.close();
  168.                     }
  169.                 }
  170.             };
  171.  
  172.             reader.setOnImageAvailableListener(readListener,mBackgroundHandler);
  173.             final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() {
  174.                 @Override
  175.                 public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
  176.                     super.onCaptureCompleted(session, request, result);
  177.                     Toast.makeText(TakePics.this, "Saved" + file, Toast.LENGTH_SHORT).show();
  178.                     createCameraPreview();
  179.                 }
  180.             };
  181.  
  182.             cameraDevice.createCaptureSession(outputSurface, new CameraCaptureSession.StateCallback() {
  183.                 @Override
  184.                 public void onConfigured(@NonNull CameraCaptureSession session) {
  185.                     try {
  186.                         cameraCaptureSession.capture(captureBuilder.build(),captureListener,mBackgroundHandler);
  187.                     } catch (CameraAccessException e) {
  188.                         e.printStackTrace();
  189.                     }
  190.                 }
  191.  
  192.                 @Override
  193.                 public void onConfigureFailed(@NonNull CameraCaptureSession session) {
  194.  
  195.                 }
  196.             },mBackgroundHandler);
  197.         } catch (CameraAccessException e) {
  198.             e.printStackTrace();
  199.         }
  200.     }
  201.  
  202.     private void createCameraPreview() {
  203.         try {
  204.             SurfaceTexture texture = textureView.getSurfaceTexture();
  205.             assert texture != null;
  206.             texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight());
  207.             Surface surface = new Surface(texture);
  208.             captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
  209.             captureRequestBuilder.addTarget(surface);
  210.             cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
  211.                 @Override
  212.                 public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
  213.                     if (cameraDevice == null)
  214.                         return;
  215.                     cameraCaptureSessions = cameraCaptureSession;
  216.                     updatePreview();
  217.                 }
  218.  
  219.                 @Override
  220.                 public void onConfigureFailed(@NonNull CameraCaptureSession session) {
  221.                     Toast.makeText(TakePics.this, "changed", Toast.LENGTH_SHORT).show();
  222.                 }
  223.             },null);
  224.         } catch (CameraAccessException e) {
  225.             e.printStackTrace();
  226.         }
  227.  
  228.     }
  229.  
  230.     private void updatePreview() {
  231.         if (cameraDevice == null)
  232.             Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
  233.         captureRequestBuilder.set(CaptureRequest.CONTROL_MODE,CaptureRequest.CONTROL_MODE_AUTO);
  234.         try {
  235.             cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(),null,mBackgroundHandler);
  236.         } catch (CameraAccessException e) {
  237.             e.printStackTrace();
  238.         }
  239.     }
  240.  
  241.  
  242.     private void openCamera() {
  243.         CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
  244.         try {
  245.             cameraId = manager.getCameraIdList()[0];
  246.             CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
  247.             StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
  248.             assert map != null;
  249.             imageDimension = map.getOutputSizes(SurfaceTexture.class)[0];
  250.             //Check realtime permission if run higher API 23
  251.             if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
  252.                 ActivityCompat.requestPermissions(this,new String[]{
  253.                         Manifest.permission.CAMERA,
  254.                         Manifest.permission.WRITE_EXTERNAL_STORAGE
  255.                 },REQUEST_CAMERA_PERMISSION);
  256.                 return;
  257.             }
  258.             manager.openCamera(cameraId,stateCallBack,null);
  259.         } catch (CameraAccessException e) {
  260.             e.printStackTrace();
  261.         }
  262.     }
  263.  
  264.     TextureView.SurfaceTextureListener textureListener = new TextureView.SurfaceTextureListener() {
  265.         @Override
  266.         public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
  267.             openCamera();
  268.         }
  269.  
  270.         @Override
  271.         public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
  272.  
  273.         }
  274.  
  275.         @Override
  276.         public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
  277.             return false;
  278.         }
  279.  
  280.         @Override
  281.         public void onSurfaceTextureUpdated(SurfaceTexture surface) {
  282.  
  283.         }
  284.     };
  285.  
  286.     @Override
  287.     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  288.         if (requestCode == REQUEST_CAMERA_PERMISSION) {
  289.             if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
  290.                 Toast.makeText(this, "You can't use camera without permission", Toast.LENGTH_SHORT).show();
  291.                 finish();
  292.             }
  293.         }
  294.     }
  295.  
  296.     @Override
  297.     protected void onResume() {
  298.         super.onResume();
  299.         startBackgroundThread();
  300.         if (textureView.isAvailable())
  301.             openCamera();
  302.         else
  303.             textureView.setSurfaceTextureListener(textureListener);
  304.     }
  305.  
  306.     @Override
  307.     protected void onPause() {
  308.         stopBackgroundThread();
  309.         super.onPause();
  310.     }
  311.  
  312.     private void stopBackgroundThread() {
  313.         mBackgroundThread.quitSafely();
  314.         try {
  315.             mBackgroundThread.join();
  316.             mBackgroundThread = null;
  317.             mBackgroundHandler = null;
  318.         } catch (InterruptedException e) {
  319.             e.printStackTrace();
  320.         }
  321.     }
  322.  
  323.     private void startBackgroundThread() {
  324.         mBackgroundThread = new HandlerThread("Camera Background");
  325.         mBackgroundThread.start();
  326.         mBackgroundHandler = new Handler(mBackgroundThread.getLooper());
  327.     }
  328. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement