Advertisement
Guest User

Untitled

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