/ocr/translate/src/com/google/marvin/translate/CaptureActivity.java

http://eyes-free.googlecode.com/ · Java · 198 lines · 157 code · 38 blank · 3 comment · 3 complexity · 61fe0b9ce58eebbb6ad7d324aa9f5b1b MD5 · raw file

  1. package com.google.marvin.translate;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.hardware.Camera;
  5. import android.hardware.Camera.Size;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.KeyEvent;
  9. import android.view.SurfaceHolder;
  10. import android.view.SurfaceView;
  11. import android.view.View;
  12. import android.view.Window;
  13. import android.view.WindowManager;
  14. import android.widget.AdapterView;
  15. import android.widget.ImageButton;
  16. import android.widget.Spinner;
  17. import android.widget.AdapterView.OnItemSelectedListener;
  18. import com.android.ocr.client.Language;
  19. import java.io.IOException;
  20. public class CaptureActivity extends Activity implements SurfaceHolder.Callback,
  21. Camera.AutoFocusCallback, Camera.PictureCallback {
  22. private static final String TAG = "CaptureActivity";
  23. public static final String EXTRA_IMAGE = "image";
  24. public static final String EXTRA_WIDTH = "width";
  25. public static final String EXTRA_HEIGHT = "height";
  26. public static final String EXTRA_FORMAT = "format";
  27. public static final String EXTRA_OCR_SOURCE = "ocr_source";
  28. private static final int DEFAULT_WIDTH = 1024;
  29. private static final int DEFAULT_HEIGHT = 768;
  30. private int mParamWidth;
  31. private int mParamHeight;
  32. private Camera mCameraDevice;
  33. private SurfaceView mSurfaceView;
  34. private SurfaceHolder mSurfaceHolder = null;
  35. private Spinner mOcrSource;
  36. private ImageButton mShutter;
  37. private boolean mBusy;
  38. @Override
  39. public void onCreate(Bundle savedInstanceState) {
  40. super.onCreate(savedInstanceState);
  41. // To reduce startup time, we open camera device in another thread.
  42. // We make sure the camera is opened at the end of onCreate.
  43. Thread openCameraThread = new Thread(new Runnable() {
  44. public void run() {
  45. try {
  46. mCameraDevice = Camera.open();
  47. } catch (RuntimeException e) {
  48. Log.e(TAG, "Failed to open camera: " + e.toString());
  49. }
  50. }
  51. });
  52. openCameraThread.start();
  53. Window win = getWindow();
  54. win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  55. setContentView(R.layout.capture);
  56. mSurfaceView = (SurfaceView) findViewById(R.id.preview);
  57. mSurfaceHolder = mSurfaceView.getHolder();
  58. mSurfaceHolder.addCallback(this);
  59. mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  60. mOcrSource = (Spinner) findViewById(R.id.ocr_source);
  61. View.OnClickListener onClick = new View.OnClickListener() {
  62. @Override
  63. public void onClick(View v) {
  64. takePicture();
  65. }
  66. };
  67. mShutter = (ImageButton) findViewById(R.id.btn_shutter);
  68. mShutter.setOnClickListener(onClick);
  69. processIntent(getIntent());
  70. try {
  71. openCameraThread.join();
  72. } catch (InterruptedException e) {
  73. Log.e(TAG, e.toString());
  74. }
  75. }
  76. @Override
  77. protected void onDestroy() {
  78. mCameraDevice.release();
  79. super.onDestroy();
  80. }
  81. @Override
  82. public boolean onKeyDown(int keyCode, KeyEvent event) {
  83. getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  84. switch (keyCode) {
  85. case KeyEvent.KEYCODE_DPAD_CENTER:
  86. case KeyEvent.KEYCODE_CAMERA:
  87. takePicture();
  88. return true;
  89. }
  90. return super.onKeyDown(keyCode, event);
  91. }
  92. @Override
  93. public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
  94. Camera.Parameters parameters = mCameraDevice.getParameters();
  95. parameters.setPreviewSize(w, h);
  96. parameters.setPictureSize(mParamHeight, mParamWidth);
  97. mCameraDevice.setParameters(parameters);
  98. if (holder.isCreating()) {
  99. mCameraDevice.startPreview();
  100. }
  101. }
  102. @Override
  103. public void surfaceCreated(SurfaceHolder holder) {
  104. try {
  105. mCameraDevice.setPreviewDisplay(holder);
  106. } catch (IOException e) {
  107. Log.e(TAG, e.toString());
  108. }
  109. }
  110. @Override
  111. public void surfaceDestroyed(SurfaceHolder holder) {
  112. mCameraDevice.stopPreview();
  113. }
  114. @Override
  115. public void onAutoFocus(boolean success, Camera camera) {
  116. Camera.Parameters parameters = camera.getParameters();
  117. parameters.setPictureSize(mParamWidth, mParamHeight);
  118. parameters.set("orientation", "landscape");
  119. camera.setParameters(parameters);
  120. camera.takePicture(null, null, this);
  121. }
  122. @Override
  123. public void onPictureTaken(byte[] image, Camera camera) {
  124. Language ocr_source = (Language) mOcrSource.getSelectedItem();
  125. Camera.Parameters params = camera.getParameters();
  126. Size size = params.getPictureSize();
  127. Intent data = new Intent();
  128. data.putExtra(CaptureActivity.EXTRA_IMAGE, image);
  129. data.putExtra(CaptureActivity.EXTRA_WIDTH, size.width);
  130. data.putExtra(CaptureActivity.EXTRA_HEIGHT, size.height);
  131. data.putExtra(CaptureActivity.EXTRA_FORMAT, params.getPictureFormat());
  132. data.putExtra(CaptureActivity.EXTRA_OCR_SOURCE, ocr_source.iso_639_2);
  133. setResult(RESULT_OK, data);
  134. finish();
  135. mBusy = false;
  136. }
  137. private void processIntent(Intent intent) {
  138. mParamWidth = intent.getIntExtra(EXTRA_WIDTH, DEFAULT_WIDTH);
  139. mParamHeight = intent.getIntExtra(EXTRA_HEIGHT, DEFAULT_HEIGHT);
  140. OnItemSelectedListener onSelected = new OnItemSelectedListener() {
  141. @Override
  142. public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {
  143. Translate.mSource.setSelection(position);
  144. }
  145. @Override
  146. public void onNothingSelected(AdapterView<?> arg0) {
  147. // do... nothing!
  148. }
  149. };
  150. Spinner mSource = Translate.mSource;
  151. mOcrSource.setAdapter(mSource.getAdapter());
  152. mOcrSource.setSelection(mSource.getSelectedItemPosition());
  153. mOcrSource.setOnItemSelectedListener(onSelected);
  154. }
  155. private void takePicture() {
  156. if (mBusy) return;
  157. mBusy = true;
  158. mCameraDevice.autoFocus(this);
  159. }
  160. }