Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.92 KB | None | 0 0
  1. private void doTakePicture(final int cameraId) throws Exception {
  2. /* Important: mCamera object must be alloc in another Thread, othwerwise, callback will NOT be invoked.
  3. * so we use "Looper" here to setup a Thread.
  4. */
  5. mMonitor.reset();
  6. new Thread() {
  7. @Override
  8. public void run() {
  9. // Set up a looper to be used by camera.
  10. Looper.prepare();
  11. Log.v(TAG, "start loopRun");
  12. // Save the looper so that we can terminate this thread
  13. // after we are done with it.
  14. mLooper = Looper.myLooper();
  15. mCamera = Camera.open(cameraId);
  16. mMonitor.signal(); // signal that we have prepared
  17. Looper.loop(); // Blocks forever until Looper.quit() is called.
  18. Log.v(TAG, "Looper: quit.");
  19. }
  20. }.start();
  21.  
  22. mMonitor.waitForSignal(10000); /* must wait for loop run */
  23.  
  24. try {
  25. mCamera.lock(); // before using camera, lock it first
  26.  
  27. // preview must be start before take picture
  28. mCamera.setPreviewDisplay(mActivity.getSurfaceHolder());
  29. mCamera.startPreview();
  30.  
  31. // setting parameters, optional
  32. Camera.Parameters parameters = mCamera.getParameters();
  33. parameters.setPictureFormat(ImageFormat.JPEG);
  34. List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
  35. Camera.Size size = sizes.get(0);
  36. parameters.setPictureSize(size.width, size.height);
  37. if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
  38. parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
  39. }
  40. List<String> supportedFlashModes = parameters.getSupportedFlashModes();
  41. if (supportedFlashModes != null && supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_ON)) {
  42. parameters.setFocusMode(Camera.Parameters.FLASH_MODE_ON);
  43. }
  44. mCamera.setParameters(parameters);
  45.  
  46. // Important: callback when picture is taken
  47. mMonitor.reset();
  48. PictureCallback jpegCallback = new PictureCallback() {
  49. @Override
  50. public void onPictureTaken(byte[] data, Camera camera) {
  51. try {
  52. /* save the picture here */
  53. FileOutputStream fos = new FileOutputStream(mOutFile);
  54. fos.write(data);
  55. fos.close();
  56. Log.i(TAG, "notify take picture done");
  57. mMonitor.signal(); // notify done
  58. /* Note: before jpegCallback is called, should NOT start preview
  59. * after calling "takePicture"
  60. */
  61. mCamera.startPreview(); // preview again
  62. } catch (FileNotFoundException e) {
  63. Log.e(TAG, "File not found: " + e.getMessage());
  64. } catch (IOException e) {
  65. Log.e(TAG, "IO Exception: " + e.getMessage());
  66. }
  67. }
  68. };
  69.  
  70.  
  71. Thread.sleep(1000); // preview for 1s
  72. Log.i(TAG, "start taking picture");
  73. mCamera.takePicture(null, null, jpegCallback);
  74.  
  75. // wait at most 4s for picture taken done
  76. boolean success = mMonitor.waitForSignal(10000); // should wait for taking picture done
  77. assertTrue(success);
  78.  
  79. // keep preview for 1s after take picture
  80. Thread.sleep(1000);
  81. mCamera.stopPreview();
  82. } finally {
  83. /* clean up */
  84. if (mCamera != null) {
  85. mCamera.unlock();
  86. mCamera.release();
  87. mCamera = null;
  88. }
  89.  
  90. mLooper.quit();
  91. mLooper.getThread().join();
  92. }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement