Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.60 KB | None | 0 0
  1. package com.example.michail.photomanager;
  2.  
  3. import android.Manifest;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.pm.ActivityInfo;
  7. import android.content.pm.PackageManager;
  8. import android.graphics.Bitmap;
  9. import android.graphics.BitmapFactory;
  10. import android.graphics.Camera;
  11. import android.graphics.Canvas;
  12. import android.graphics.Color;
  13. import android.graphics.ImageFormat;
  14. import android.graphics.Paint;
  15. import android.graphics.PixelFormat;
  16. import android.graphics.Point;
  17. import android.graphics.Rect;
  18. import android.graphics.RectF;
  19. import android.graphics.SurfaceTexture;
  20. import android.graphics.YuvImage;
  21. import android.hardware.camera2.params.StreamConfigurationMap;
  22. import android.media.Image;
  23. import android.media.ImageReader;
  24. import android.media.MediaPlayer;
  25. import android.os.Build;
  26. import android.os.Environment;
  27. import android.os.Handler;
  28. import android.os.HandlerThread;
  29. import android.provider.MediaStore;
  30. import android.support.annotation.IntDef;
  31. import android.support.annotation.NonNull;
  32. import android.support.annotation.RequiresApi;
  33. //import android.support.annotation.Size;
  34. import android.support.v4.content.ContextCompat;
  35. import android.support.v7.app.AppCompatActivity;
  36. import android.os.Bundle;
  37.  
  38. import com.google.android.gms.vision.Frame;
  39. import com.google.android.gms.vision.barcode.Barcode;
  40. import com.google.android.gms.vision.barcode.BarcodeDetector;
  41.  
  42. import android.hardware.camera2.*;
  43. import android.text.style.TtsSpan;
  44. import android.util.DisplayMetrics;
  45. import android.util.Log;
  46. import android.util.Size;
  47. import android.util.SparseArray;
  48. import android.util.SparseIntArray;
  49. import android.view.Surface;
  50. import android.view.TextureView;
  51. import android.view.View;
  52. import android.view.ViewGroup;
  53. import android.widget.Button;
  54. import android.widget.ImageButton;
  55. import android.widget.ImageView;
  56. import android.widget.Toast;
  57.  
  58. import java.io.ByteArrayInputStream;
  59. import java.io.ByteArrayOutputStream;
  60. import java.io.File;
  61. import java.io.FileNotFoundException;
  62. import java.io.FileOutputStream;
  63. import java.io.IOException;
  64. import java.nio.ByteBuffer;
  65. import java.text.SimpleDateFormat;
  66. import java.util.ArrayList;
  67. import java.util.Arrays;
  68. import java.util.Collection;
  69. import java.util.Collections;
  70. import java.util.Comparator;
  71. import java.util.Date;
  72. import java.util.List;
  73.  
  74.  
  75. public class MainActivity extends AppCompatActivity {
  76.  
  77. private static final String TAG = " MyTag ";
  78. private static final int REQUEST_CAMERA_PERMISSION_RESULT = 0;
  79. public static String LOG_TAG = null;
  80. private TextureView mTextureView;
  81. private int counter = 0;
  82.  
  83. private TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() {
  84. @Override
  85. public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
  86. //Toast.makeText(getApplicationContext(), "TextureView is available", Toast.LENGTH_SHORT).show();
  87. setupCamera(width, height);
  88. connectCamera();
  89.  
  90.  
  91. }
  92.  
  93. @Override
  94. public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {
  95.  
  96. }
  97.  
  98. @Override
  99. public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
  100. return false;
  101. }
  102.  
  103. @Override
  104. public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
  105. counter++;
  106. if (counter == 50) {
  107. lockFocus();
  108. counter = 0;
  109. }
  110. //synchronized (mImageReaderSurface){
  111. //lockFocus();
  112. //}
  113. }
  114. };
  115. CameraDevice mCameraDevice;
  116. private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {
  117. @Override
  118. public void onOpened(@NonNull CameraDevice cameraDevice) {
  119. mCameraDevice = cameraDevice;
  120. startPreview();
  121. Toast.makeText(getApplicationContext(), "Camera connection made :)", Toast.LENGTH_SHORT).show();
  122.  
  123. }
  124.  
  125. @Override
  126. public void onDisconnected(@NonNull CameraDevice cameraDevice) {
  127. cameraDevice.close();
  128. mCameraDevice = null;
  129. }
  130.  
  131. @Override
  132. public void onError(@NonNull CameraDevice cameraDevice, int error) {
  133. cameraDevice.close();
  134. mCameraDevice = null;
  135. }
  136. };
  137. private File mImageFolder;
  138. private String mImageFileName;
  139. private Size mImageSize;
  140. private Surface mPreviewSurface;
  141. private HandlerThread mBackgroundHandlerThread;
  142. private HandlerThread mPhotoImageHandlerThread;
  143. private Handler mBackgroundHandler;
  144. private String mCameraId;
  145. private Size mPreviewSize;
  146. private CaptureRequest.Builder mCaptureRequestBuilder;
  147. private ImageButton switch_On_or_Off;
  148. private boolean isFlashOn = false;
  149. private boolean hasFlash;
  150. private CameraCaptureSession mSession;
  151. private CameraCharacteristics mCameraCharacteristics;
  152. private ImageReader mImageReader;
  153. private Surface mImageReaderSurface;
  154.  
  155. private final int STATE_PREVIEW = 0;
  156. private final int STATE_WAIT_LOCK = 1;
  157. private int mCaptureState = STATE_PREVIEW;
  158. private Thread mCatchThread;
  159. private Paint myRectPaint;
  160. private ImageView mImageView;
  161.  
  162. private CameraCaptureSession.CaptureCallback mPreviewCaptureCallback = new CameraCaptureSession.CaptureCallback() {
  163. private void process(CaptureResult mCaptureResult) {
  164. //switch (mCaptureState) {
  165. // case STATE_PREVIEW: //mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER , CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
  166. // break;
  167. //case STATE_WAIT_LOCK:
  168. //mCaptureState = STATE_PREVIEW;
  169. // Integer afState = mCaptureResult.get(CaptureResult.CONTROL_AF_STATE);
  170. //if (afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED ||
  171. // afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) {
  172. //Toast.makeText(getApplicationContext() , "AF Locked !" , Toast.LENGTH_SHORT).show();
  173. startStillCaptureRequest();
  174.  
  175. //mImageReaderSurface.
  176.  
  177. // }
  178. //break;
  179.  
  180. // }
  181. }
  182.  
  183. @Override
  184. public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
  185. super.onCaptureCompleted(session, request, result);
  186. process(result);
  187. }
  188. };
  189.  
  190.  
  191. private static SparseIntArray ORIENTATIONS = new SparseIntArray();
  192.  
  193. static {
  194. ORIENTATIONS.append(Surface.ROTATION_0, 0);
  195. ORIENTATIONS.append(Surface.ROTATION_90, 90);
  196. ORIENTATIONS.append(Surface.ROTATION_180, 180);
  197. ORIENTATIONS.append(Surface.ROTATION_270, 0);
  198. }
  199.  
  200. private static class CompareSizeByArea implements Comparator<Size> {
  201.  
  202. @Override
  203. public int compare(Size lhs, Size rhs) {
  204. return Long.signum((long) lhs.getWidth() * lhs.getHeight() / (long) rhs.getWidth() * rhs.getHeight());
  205. }
  206.  
  207. }
  208.  
  209.  
  210. @Override
  211. protected void onCreate(Bundle savedInstanceState) {
  212. super.onCreate(savedInstanceState);
  213. // createImageFolder();
  214. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  215. setContentView(R.layout.activity_main);
  216. mTextureView = (TextureView) findViewById(R.id.textureView);
  217. //mImageView = (ImageView ) findViewById(R.id.imageView);
  218. switch_On_or_Off = (ImageButton) findViewById(R.id.imageButton);
  219. //myRectPaint = new Paint();
  220. //myRectPaint.setStrokeWidth(10);
  221. //myRectPaint.setColor(Color.RED);
  222. //myRectPaint.setStyle(Paint.Style.STROKE);
  223. /*switch_On_or_Off.setOnClickListener(new View.OnClickListener() {
  224. @Override
  225. public void onClick(View view) {
  226. if (mCameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
  227. isFlashOn = true;
  228. i = 0;
  229. } else {
  230. Toast.makeText(getApplicationContext(), "No flashlight on this device.", Toast.LENGTH_SHORT);
  231. }
  232. //lockFocus();
  233.  
  234. }
  235.  
  236.  
  237. });*/
  238.  
  239.  
  240. }
  241.  
  242.  
  243. private void createImageFolder() {
  244. File imageFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
  245. mImageFolder = new File(imageFile, "camera2");
  246. if (!mImageFolder.exists()) {
  247. mImageFolder.mkdirs();
  248. }
  249. }
  250.  
  251. private File createImageFileName() {
  252. String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
  253. String prepend = "IMAGE_" + timestamp + "_";
  254. File imageFile = null;
  255. try {
  256. imageFile = File.createTempFile(prepend, ".jpg", mImageFolder);
  257. mImageFileName = imageFile.getAbsolutePath();
  258. } catch (IOException e) {
  259. e.printStackTrace();
  260. }
  261.  
  262. return imageFile;
  263. }
  264.  
  265.  
  266. private void turnOnFlash() {
  267. mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
  268. }
  269.  
  270. private void turnOffFlash() {
  271. // TODO
  272. mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
  273. }
  274.  
  275. @Override
  276. protected void onResume() {
  277. super.onResume();
  278. startBackgroundThread();
  279. if (mTextureView.isAvailable()) {
  280. setupCamera(mTextureView.getWidth(), mTextureView.getHeight());
  281. connectCamera();
  282.  
  283. } else {
  284. mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
  285. }
  286. }
  287.  
  288.  
  289. @Override
  290. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  291. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  292. if (requestCode == REQUEST_CAMERA_PERMISSION_RESULT) {
  293. if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
  294. Toast.makeText(getApplicationContext(), "Application will not run without camera services", Toast.LENGTH_SHORT).show();
  295.  
  296. }
  297. }
  298. }
  299.  
  300. @Override
  301. protected void onPause() {
  302. closeCamera();
  303. stopBackgroundThread();
  304. super.onPause();
  305.  
  306. }
  307.  
  308. @Override
  309. public void onWindowFocusChanged(boolean hasFocus) {
  310.  
  311. super.onWindowFocusChanged(hasFocus);
  312. View decorView = getWindow().getDecorView();
  313. if (hasFocus) {
  314. decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  315. | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
  316. | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
  317. | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
  318. | View.SYSTEM_UI_FLAG_FULLSCREEN
  319. | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
  320.  
  321. }
  322. }
  323.  
  324. private void setupCamera(int width, int height) {
  325. CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
  326. try {
  327. for (String cameraId : cameraManager.getCameraIdList()) {
  328. mCameraCharacteristics = (CameraCharacteristics) cameraManager.getCameraCharacteristics(cameraId);
  329. if (mCameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT) {
  330. continue;
  331. }
  332. StreamConfigurationMap map = mCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
  333. int deviceOrientation = getWindowManager().getDefaultDisplay().getRotation();
  334. int totalRotation = sensorToDeviceRotation(mCameraCharacteristics, deviceOrientation);
  335. boolean swapRotation = totalRotation == 90 || totalRotation == 270;
  336. int rotatedWidth = width;
  337. int rotatedHeight = height;
  338. if (swapRotation) {
  339. rotatedWidth = height;
  340. rotatedHeight = width;
  341. }
  342. mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), rotatedWidth, rotatedHeight);
  343. mImageSize = chooseOptimalSize(map.getOutputSizes(ImageFormat.JPEG), rotatedWidth, rotatedHeight);
  344. mImageReader = ImageReader.newInstance(mImageSize.getWidth(), mImageSize.getHeight(), ImageFormat.JPEG, 2);
  345.  
  346. //mImageReader = ImageReader.newInstance(320, 240, ImageFormat.JPEG, 1);
  347. mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);
  348. mImageReaderSurface = mImageReader.getSurface();
  349. mCameraId = cameraId;
  350. return;
  351. }
  352.  
  353. } catch (CameraAccessException e) {
  354. e.printStackTrace();
  355. }
  356. }
  357.  
  358. private void connectCamera() {
  359. CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
  360. try {
  361. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  362. if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
  363. cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler);
  364. } else {
  365. if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
  366. Toast.makeText(this, "Video app required access to camera", Toast.LENGTH_SHORT).show();
  367. }
  368. requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION_RESULT);
  369. }
  370. } else {
  371. cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler);
  372. }
  373. } catch (CameraAccessException e) {
  374. e.printStackTrace();
  375. }
  376. }
  377.  
  378. private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
  379.  
  380. @Override
  381. public void onImageAvailable(ImageReader imageReader) {
  382. mBackgroundHandler.post(new ImageRelease(imageReader.acquireLatestImage()));
  383. }
  384. };
  385.  
  386.  
  387. private class ImageRelease implements Runnable {
  388. private final Image mImage;
  389.  
  390. public ImageRelease(Image image) {
  391. mImage = image;
  392. }
  393.  
  394. @Override
  395. public void run() {
  396. ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
  397. byte[] bytes = new byte[buffer.remaining()];
  398. buffer.get(bytes);
  399. //Toast.makeText(getApplicationContext(), "photo has been taken", Toast.LENGTH_SHORT).show();
  400. Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
  401. //Bitmap tempBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);
  402. //Canvas tempCanvas = new Canvas(tempBitmap);
  403. //tempCanvas.drawBitmap(bitmap, 0, 0, null);
  404. BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(getApplicationContext())
  405. .setBarcodeFormats(Barcode.ALL_FORMATS).build();
  406. if (!barcodeDetector.isOperational()) {
  407. Toast.makeText(getApplicationContext(), "Could not set up the detector!", Toast.LENGTH_SHORT).show();
  408. }
  409. Frame frame = new Frame.Builder().setBitmap(bitmap).build();
  410. SparseArray<Barcode> barcodes = barcodeDetector.detect(frame);
  411. if (barcodes.size() != 0) {
  412. Barcode thisCode = barcodes.valueAt(0);
  413. for (Point i : thisCode.cornerPoints) {
  414. Log.i("poidssdf", i.toString());
  415. }
  416. //tempCanvas.drawRoundRect(new RectF(), 2, 2, myRectPaint);
  417. /* mImageView.setImageBitmap();
  418. mImageView.setX(thisCode.cornerPoints[0].x);
  419. mImageView.setY(thisCode.cornerPoints[0].y);
  420. mImageView.setScaleX(10);
  421. mImageView.setScaleY(10);*/
  422.  
  423.  
  424. //mPreviewSurface.unlockCanvasAndPost(tempCanvas);
  425.  
  426. Toast.makeText(getApplicationContext(), String.valueOf(thisCode.rawValue), Toast.LENGTH_SHORT).show();
  427. } else {
  428. //Toast.makeText(getApplicationContext(), "Empty sparse array", Toast.LENGTH_SHORT).show();
  429. }
  430. mImage.close();
  431. barcodes.delete(0);
  432.  
  433.  
  434. }
  435. }
  436.  
  437.  
  438. private void startPreview() {
  439. SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
  440. surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
  441.  
  442. final Surface previewSurface = new Surface(surfaceTexture);
  443. try {
  444. mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
  445. mCaptureRequestBuilder.addTarget(previewSurface);
  446. //mCaptureRequestBuilder.addTarget(mImageReaderSurface);
  447.  
  448. mCameraDevice.createCaptureSession(Arrays.asList(previewSurface, mImageReaderSurface), new CameraCaptureSession.StateCallback() {
  449. @RequiresApi(api = Build.VERSION_CODES.M)
  450. @Override
  451. public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
  452. try {
  453. mPreviewSurface = previewSurface;
  454. //mPreviewSurface.lockHardwareCanvas();
  455. //mPreviewSurface.lockCanvas(new Rect());
  456. //Log.i("surf" , );
  457. //mPreviewSurface.unlockCanvasAndPost(new Canvas());
  458. mSession = cameraCaptureSession;
  459. mSession.setRepeatingRequest(mCaptureRequestBuilder.build(), null, mBackgroundHandler);
  460.  
  461.  
  462. } catch (CameraAccessException e) {
  463. e.printStackTrace();
  464. }
  465. }
  466.  
  467. @Override
  468. public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
  469. Toast.makeText(getApplicationContext(), "Unable to setup camera preview", Toast.LENGTH_SHORT).show();
  470.  
  471. }
  472. }, null);
  473.  
  474. } catch (CameraAccessException e) {
  475. e.printStackTrace();
  476. }
  477.  
  478. }
  479.  
  480. private void startStillCaptureRequest() {
  481. try {
  482. mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
  483. mCaptureRequestBuilder.addTarget(mImageReader.getSurface());
  484. //mCaptureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION );
  485.  
  486. CameraCaptureSession.CaptureCallback stillCaptureCallback = new CameraCaptureSession.CaptureCallback() {
  487. @Override
  488. public void onCaptureStarted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, long timestamp, long frameNumber) {
  489. super.onCaptureStarted(session, request, timestamp, frameNumber);
  490. //createImageFileName();
  491. }
  492. };
  493.  
  494. mSession.capture(mCaptureRequestBuilder.build(), stillCaptureCallback, null);
  495. } catch (CameraAccessException e) {
  496. e.printStackTrace();
  497. }
  498. }
  499.  
  500. private void closeCamera() {
  501. if (mCameraDevice != null) {
  502. mCameraDevice.close();
  503. mCameraDevice = null;
  504. }
  505. }
  506.  
  507. private void startBackgroundThread() {
  508. mBackgroundHandlerThread = new HandlerThread("Camera2");
  509. mBackgroundHandlerThread.start();
  510. mBackgroundHandler = new Handler(mBackgroundHandlerThread.getLooper());
  511.  
  512. }
  513.  
  514. private void stopBackgroundThread() {
  515. mBackgroundHandlerThread.quitSafely();
  516. try {
  517. mBackgroundHandlerThread.join();
  518. mBackgroundHandlerThread = null;
  519. mBackgroundHandler = null;
  520. } catch (InterruptedException e) {
  521. e.printStackTrace();
  522. }
  523.  
  524. }
  525.  
  526. private static int sensorToDeviceRotation(CameraCharacteristics cameraCharacteristics, int deviceOrientation) {
  527. int sensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
  528. deviceOrientation = ORIENTATIONS.get(deviceOrientation);
  529. return (sensorOrientation + deviceOrientation + 360) % 360;
  530. }
  531.  
  532. private static Size chooseOptimalSize(Size[] choices, int width, int height) {
  533. List<Size> bigEnough = new ArrayList<Size>();
  534. for (Size option : choices) {
  535. if (option.getHeight() == option.getWidth() * height / width && option.getWidth() >= width && option.getHeight() >= height) {
  536. bigEnough.add(option);
  537. }
  538. }
  539. if (bigEnough.size() > 0) {
  540. return Collections.min(bigEnough, new CompareSizeByArea());
  541. } else {
  542. return choices[0];
  543. }
  544. }
  545.  
  546.  
  547. int i = 0;
  548.  
  549. private void lockFocus() {
  550. //mCaptureState = STATE_WAIT_LOCK;
  551. //mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
  552.  
  553. // mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
  554.  
  555. try {
  556. mSession.capture(mCaptureRequestBuilder.build(), mPreviewCaptureCallback, null);///////?
  557.  
  558. } catch (CameraAccessException e) {
  559. e.printStackTrace();
  560. }
  561. }
  562.  
  563.  
  564. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement