Guest User

Untitled

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