Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.example.michail.photomanager;
- import android.Manifest;
- import android.content.Context;
- import android.content.Intent;
- import android.content.pm.ActivityInfo;
- import android.content.pm.PackageManager;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Camera;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.ImageFormat;
- import android.graphics.Paint;
- import android.graphics.PixelFormat;
- import android.graphics.Point;
- import android.graphics.Rect;
- import android.graphics.RectF;
- import android.graphics.SurfaceTexture;
- import android.graphics.YuvImage;
- import android.hardware.camera2.params.StreamConfigurationMap;
- import android.media.Image;
- import android.media.ImageReader;
- import android.media.MediaPlayer;
- import android.os.Build;
- import android.os.Environment;
- import android.os.Handler;
- import android.os.HandlerThread;
- import android.provider.MediaStore;
- import android.support.annotation.IntDef;
- import android.support.annotation.NonNull;
- import android.support.annotation.RequiresApi;
- //import android.support.annotation.Size;
- import android.support.v4.content.ContextCompat;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import com.google.android.gms.vision.Frame;
- import com.google.android.gms.vision.barcode.Barcode;
- import com.google.android.gms.vision.barcode.BarcodeDetector;
- import android.hardware.camera2.*;
- import android.text.style.TtsSpan;
- import android.util.DisplayMetrics;
- import android.util.Log;
- import android.util.Size;
- import android.util.SparseArray;
- import android.util.SparseIntArray;
- import android.view.Surface;
- import android.view.TextureView;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.Button;
- import android.widget.ImageButton;
- import android.widget.ImageView;
- import android.widget.Toast;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.nio.ByteBuffer;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.Date;
- import java.util.List;
- public class MainActivity extends AppCompatActivity {
- private static final String TAG = " MyTag ";
- private static final int REQUEST_CAMERA_PERMISSION_RESULT = 0;
- public static String LOG_TAG = null;
- private TextureView mTextureView;
- private int counter = 0;
- private TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() {
- @Override
- public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
- //Toast.makeText(getApplicationContext(), "TextureView is available", Toast.LENGTH_SHORT).show();
- setupCamera(width, height);
- connectCamera();
- }
- @Override
- public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {
- }
- @Override
- public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
- return false;
- }
- @Override
- public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
- counter++;
- if (counter == 50) {
- lockFocus();
- counter = 0;
- }
- //synchronized (mImageReaderSurface){
- //lockFocus();
- //}
- }
- };
- CameraDevice mCameraDevice;
- private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {
- @Override
- public void onOpened(@NonNull CameraDevice cameraDevice) {
- mCameraDevice = cameraDevice;
- startPreview();
- Toast.makeText(getApplicationContext(), "Camera connection made :)", Toast.LENGTH_SHORT).show();
- }
- @Override
- public void onDisconnected(@NonNull CameraDevice cameraDevice) {
- cameraDevice.close();
- mCameraDevice = null;
- }
- @Override
- public void onError(@NonNull CameraDevice cameraDevice, int error) {
- cameraDevice.close();
- mCameraDevice = null;
- }
- };
- private File mImageFolder;
- private String mImageFileName;
- private Size mImageSize;
- private Surface mPreviewSurface;
- private HandlerThread mBackgroundHandlerThread;
- private HandlerThread mPhotoImageHandlerThread;
- private Handler mBackgroundHandler;
- private String mCameraId;
- private Size mPreviewSize;
- private CaptureRequest.Builder mCaptureRequestBuilder;
- private ImageButton switch_On_or_Off;
- private boolean isFlashOn = false;
- private boolean hasFlash;
- private CameraCaptureSession mSession;
- private CameraCharacteristics mCameraCharacteristics;
- private ImageReader mImageReader;
- private Surface mImageReaderSurface;
- private final int STATE_PREVIEW = 0;
- private final int STATE_WAIT_LOCK = 1;
- private int mCaptureState = STATE_PREVIEW;
- private Thread mCatchThread;
- private Paint myRectPaint;
- private ImageView mImageView;
- private CameraCaptureSession.CaptureCallback mPreviewCaptureCallback = new CameraCaptureSession.CaptureCallback() {
- private void process(CaptureResult mCaptureResult) {
- //switch (mCaptureState) {
- // case STATE_PREVIEW: //mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER , CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
- // break;
- //case STATE_WAIT_LOCK:
- //mCaptureState = STATE_PREVIEW;
- // Integer afState = mCaptureResult.get(CaptureResult.CONTROL_AF_STATE);
- //if (afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED ||
- // afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) {
- //Toast.makeText(getApplicationContext() , "AF Locked !" , Toast.LENGTH_SHORT).show();
- startStillCaptureRequest();
- //mImageReaderSurface.
- // }
- //break;
- // }
- }
- @Override
- public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
- super.onCaptureCompleted(session, request, result);
- process(result);
- }
- };
- private static SparseIntArray ORIENTATIONS = new SparseIntArray();
- static {
- ORIENTATIONS.append(Surface.ROTATION_0, 0);
- ORIENTATIONS.append(Surface.ROTATION_90, 90);
- ORIENTATIONS.append(Surface.ROTATION_180, 180);
- ORIENTATIONS.append(Surface.ROTATION_270, 0);
- }
- private static class CompareSizeByArea implements Comparator<Size> {
- @Override
- public int compare(Size lhs, Size rhs) {
- return Long.signum((long) lhs.getWidth() * lhs.getHeight() / (long) rhs.getWidth() * rhs.getHeight());
- }
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // createImageFolder();
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- setContentView(R.layout.activity_main);
- mTextureView = (TextureView) findViewById(R.id.textureView);
- //mImageView = (ImageView ) findViewById(R.id.imageView);
- switch_On_or_Off = (ImageButton) findViewById(R.id.imageButton);
- //myRectPaint = new Paint();
- //myRectPaint.setStrokeWidth(10);
- //myRectPaint.setColor(Color.RED);
- //myRectPaint.setStyle(Paint.Style.STROKE);
- /*switch_On_or_Off.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- if (mCameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
- isFlashOn = true;
- i = 0;
- } else {
- Toast.makeText(getApplicationContext(), "No flashlight on this device.", Toast.LENGTH_SHORT);
- }
- //lockFocus();
- }
- });*/
- }
- private void createImageFolder() {
- File imageFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
- mImageFolder = new File(imageFile, "camera2");
- if (!mImageFolder.exists()) {
- mImageFolder.mkdirs();
- }
- }
- private File createImageFileName() {
- String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
- String prepend = "IMAGE_" + timestamp + "_";
- File imageFile = null;
- try {
- imageFile = File.createTempFile(prepend, ".jpg", mImageFolder);
- mImageFileName = imageFile.getAbsolutePath();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return imageFile;
- }
- private void turnOnFlash() {
- mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
- }
- private void turnOffFlash() {
- // TODO
- mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
- }
- @Override
- protected void onResume() {
- super.onResume();
- startBackgroundThread();
- if (mTextureView.isAvailable()) {
- setupCamera(mTextureView.getWidth(), mTextureView.getHeight());
- connectCamera();
- } else {
- mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
- }
- }
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- if (requestCode == REQUEST_CAMERA_PERMISSION_RESULT) {
- if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
- Toast.makeText(getApplicationContext(), "Application will not run without camera services", Toast.LENGTH_SHORT).show();
- }
- }
- }
- @Override
- protected void onPause() {
- closeCamera();
- stopBackgroundThread();
- super.onPause();
- }
- @Override
- public void onWindowFocusChanged(boolean hasFocus) {
- super.onWindowFocusChanged(hasFocus);
- View decorView = getWindow().getDecorView();
- if (hasFocus) {
- decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
- | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- | View.SYSTEM_UI_FLAG_FULLSCREEN
- | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
- }
- }
- private void setupCamera(int width, int height) {
- CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
- try {
- for (String cameraId : cameraManager.getCameraIdList()) {
- mCameraCharacteristics = (CameraCharacteristics) cameraManager.getCameraCharacteristics(cameraId);
- if (mCameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT) {
- continue;
- }
- StreamConfigurationMap map = mCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
- int deviceOrientation = getWindowManager().getDefaultDisplay().getRotation();
- int totalRotation = sensorToDeviceRotation(mCameraCharacteristics, deviceOrientation);
- boolean swapRotation = totalRotation == 90 || totalRotation == 270;
- int rotatedWidth = width;
- int rotatedHeight = height;
- if (swapRotation) {
- rotatedWidth = height;
- rotatedHeight = width;
- }
- mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), rotatedWidth, rotatedHeight);
- mImageSize = chooseOptimalSize(map.getOutputSizes(ImageFormat.JPEG), rotatedWidth, rotatedHeight);
- mImageReader = ImageReader.newInstance(mImageSize.getWidth(), mImageSize.getHeight(), ImageFormat.JPEG, 2);
- //mImageReader = ImageReader.newInstance(320, 240, ImageFormat.JPEG, 1);
- mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);
- mImageReaderSurface = mImageReader.getSurface();
- mCameraId = cameraId;
- return;
- }
- } catch (CameraAccessException e) {
- e.printStackTrace();
- }
- }
- private void connectCamera() {
- CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
- try {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
- cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler);
- } else {
- if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
- Toast.makeText(this, "Video app required access to camera", Toast.LENGTH_SHORT).show();
- }
- requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION_RESULT);
- }
- } else {
- cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler);
- }
- } catch (CameraAccessException e) {
- e.printStackTrace();
- }
- }
- private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
- @Override
- public void onImageAvailable(ImageReader imageReader) {
- mBackgroundHandler.post(new ImageRelease(imageReader.acquireLatestImage()));
- }
- };
- private class ImageRelease implements Runnable {
- private final Image mImage;
- public ImageRelease(Image image) {
- mImage = image;
- }
- @Override
- public void run() {
- ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
- byte[] bytes = new byte[buffer.remaining()];
- buffer.get(bytes);
- //Toast.makeText(getApplicationContext(), "photo has been taken", Toast.LENGTH_SHORT).show();
- Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
- //Bitmap tempBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);
- //Canvas tempCanvas = new Canvas(tempBitmap);
- //tempCanvas.drawBitmap(bitmap, 0, 0, null);
- BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(getApplicationContext())
- .setBarcodeFormats(Barcode.ALL_FORMATS).build();
- if (!barcodeDetector.isOperational()) {
- Toast.makeText(getApplicationContext(), "Could not set up the detector!", Toast.LENGTH_SHORT).show();
- }
- Frame frame = new Frame.Builder().setBitmap(bitmap).build();
- SparseArray<Barcode> barcodes = barcodeDetector.detect(frame);
- if (barcodes.size() != 0) {
- Barcode thisCode = barcodes.valueAt(0);
- for (Point i : thisCode.cornerPoints) {
- Log.i("poidssdf", i.toString());
- }
- //tempCanvas.drawRoundRect(new RectF(), 2, 2, myRectPaint);
- /* mImageView.setImageBitmap();
- mImageView.setX(thisCode.cornerPoints[0].x);
- mImageView.setY(thisCode.cornerPoints[0].y);
- mImageView.setScaleX(10);
- mImageView.setScaleY(10);*/
- //mPreviewSurface.unlockCanvasAndPost(tempCanvas);
- Toast.makeText(getApplicationContext(), String.valueOf(thisCode.rawValue), Toast.LENGTH_SHORT).show();
- } else {
- //Toast.makeText(getApplicationContext(), "Empty sparse array", Toast.LENGTH_SHORT).show();
- }
- mImage.close();
- barcodes.delete(0);
- }
- }
- private void startPreview() {
- SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
- surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
- final Surface previewSurface = new Surface(surfaceTexture);
- try {
- mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
- mCaptureRequestBuilder.addTarget(previewSurface);
- //mCaptureRequestBuilder.addTarget(mImageReaderSurface);
- mCameraDevice.createCaptureSession(Arrays.asList(previewSurface, mImageReaderSurface), new CameraCaptureSession.StateCallback() {
- @RequiresApi(api = Build.VERSION_CODES.M)
- @Override
- public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
- try {
- mPreviewSurface = previewSurface;
- //mPreviewSurface.lockHardwareCanvas();
- //mPreviewSurface.lockCanvas(new Rect());
- //Log.i("surf" , );
- //mPreviewSurface.unlockCanvasAndPost(new Canvas());
- mSession = cameraCaptureSession;
- mSession.setRepeatingRequest(mCaptureRequestBuilder.build(), null, mBackgroundHandler);
- } catch (CameraAccessException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
- Toast.makeText(getApplicationContext(), "Unable to setup camera preview", Toast.LENGTH_SHORT).show();
- }
- }, null);
- } catch (CameraAccessException e) {
- e.printStackTrace();
- }
- }
- private void startStillCaptureRequest() {
- try {
- mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
- mCaptureRequestBuilder.addTarget(mImageReader.getSurface());
- //mCaptureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION );
- CameraCaptureSession.CaptureCallback stillCaptureCallback = new CameraCaptureSession.CaptureCallback() {
- @Override
- public void onCaptureStarted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, long timestamp, long frameNumber) {
- super.onCaptureStarted(session, request, timestamp, frameNumber);
- //createImageFileName();
- }
- };
- mSession.capture(mCaptureRequestBuilder.build(), stillCaptureCallback, null);
- } catch (CameraAccessException e) {
- e.printStackTrace();
- }
- }
- private void closeCamera() {
- if (mCameraDevice != null) {
- mCameraDevice.close();
- mCameraDevice = null;
- }
- }
- private void startBackgroundThread() {
- mBackgroundHandlerThread = new HandlerThread("Camera2");
- mBackgroundHandlerThread.start();
- mBackgroundHandler = new Handler(mBackgroundHandlerThread.getLooper());
- }
- private void stopBackgroundThread() {
- mBackgroundHandlerThread.quitSafely();
- try {
- mBackgroundHandlerThread.join();
- mBackgroundHandlerThread = null;
- mBackgroundHandler = null;
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- private static int sensorToDeviceRotation(CameraCharacteristics cameraCharacteristics, int deviceOrientation) {
- int sensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
- deviceOrientation = ORIENTATIONS.get(deviceOrientation);
- return (sensorOrientation + deviceOrientation + 360) % 360;
- }
- private static Size chooseOptimalSize(Size[] choices, int width, int height) {
- List<Size> bigEnough = new ArrayList<Size>();
- for (Size option : choices) {
- if (option.getHeight() == option.getWidth() * height / width && option.getWidth() >= width && option.getHeight() >= height) {
- bigEnough.add(option);
- }
- }
- if (bigEnough.size() > 0) {
- return Collections.min(bigEnough, new CompareSizeByArea());
- } else {
- return choices[0];
- }
- }
- int i = 0;
- private void lockFocus() {
- //mCaptureState = STATE_WAIT_LOCK;
- //mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
- // mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
- try {
- mSession.capture(mCaptureRequestBuilder.build(), mPreviewCaptureCallback, null);///////?
- } catch (CameraAccessException e) {
- e.printStackTrace();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement