左晓为主开发手持机充值管理机
zuoxiao
2023-12-01 57dfbac311ccaa6900c0450e71460856010a0bad
app/src/main/java/com/dayu/recharge/activity/CameraActivity.java
@@ -21,6 +21,7 @@
import android.widget.TextView;
import android.widget.Toast;
import com.dayu.recharge.R;
import com.dayu.recharge.view.ViewfinderView;
import com.yunmai.cc.idcard.controler.CameraManager;
@@ -28,399 +29,422 @@
import com.yunmai.cc.idcard.controler.OcrManager;
import com.yunmai.cc.idcard.vo.IdCardInfoNew;
import java.io.UnsupportedEncodingException;
/**
 * 视频识别类
 *
 *
 * @author fangcm 2013-03-18
 *
 */
public class CameraActivity extends BaseActivity implements SurfaceHolder.Callback {
public class CameraActivity extends Activity implements SurfaceHolder.Callback {
   private final String TAG = "cc_idcard";
    private final String TAG = "cc_idcard";
   private TextView tvTips;
   private SurfaceView sv_preview;
   private SurfaceHolder surfaceHolder;
   private CameraManager cameraManager;
   private boolean autoFoucs = true;
   private ViewfinderView finderView;
   private OcrManager ocrManager;
   private Rect rect;
   private boolean cameraError = false;
   // private boolean over = false;
    private TextView tvTips;
    private SurfaceView sv_preview;
    private SurfaceHolder surfaceHolder;
    private CameraManager cameraManager;
    private boolean autoFoucs = true;
    private ViewfinderView finderView;
    private OcrManager ocrManager;
    private Rect rect;
    private boolean cameraError = false;
    // private boolean over = false;
   private Button btnFlash, btnCancel;
   private ImageView imgTips;
   private ImageView iv, ivHead;
   private int typeFront = 1;// 0不区分 ,1正面,2背面
    private Button btnFlash, btnCancel;
    private ImageView imgTips;
    private ImageView iv, ivHead;
    private int typeFront = 0;// 0不区分 ,1正面,2背面
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.camera);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);
      typeFront = this.getIntent().getIntExtra("typeFront", 0);
      initView();
      cameraManager = new CameraManager(getBaseContext(), mHandler);
      mCameraOpenThread.start();
      try {
         mCameraOpenThread.join();
         mCameraOpenThread = null;
      } catch (Exception e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         cameraError = true;
      }
      if (cameraError) {
         Toast.makeText(getBaseContext(), "照相机未启动!", Toast.LENGTH_SHORT).show();
         finish();
         return;
      }
      setParameters();
        typeFront = this.getIntent().getIntExtra("typeFront", 0);
        initView();
        cameraManager = new CameraManager(getBaseContext(), mHandler);
        mCameraOpenThread.start();
        try {
            mCameraOpenThread.join();
            mCameraOpenThread = null;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            cameraError = true;
        }
        if (cameraError) {
            Toast.makeText(getBaseContext(), "照相机未启动!", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
        setParameters();
   }
    }
   private Thread mCameraOpenThread = new Thread(new Runnable() {
      @Override
      public void run() {
         try {
            cameraManager.openCamera();
         } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            cameraError = true;
         }
      }
   });
    private Thread mCameraOpenThread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                cameraManager.openCamera();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                cameraError = true;
            }
        }
    });
   private void setParameters() {
    private void setParameters() {
      WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
      Display display = manager.getDefaultDisplay();
      int wWidth = display.getWidth();
      int wHeight = display.getHeight();
        WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        Display display = manager.getDefaultDisplay();
        int wWidth = display.getWidth();
        int wHeight = display.getHeight();
      cameraManager.setCameraFlashModel(Camera.Parameters.FLASH_MODE_OFF);
        cameraManager.setCameraFlashModel(Camera.Parameters.FLASH_MODE_OFF);
      float ps = wWidth * 1.0f / wHeight;
      cameraManager.setPreviewSize(ps);
        float ps = wWidth * 1.0f / wHeight;
        cameraManager.setPreviewSize(ps);
      int pWidth = cameraManager.getPreviewWidth();
      int pHeight = cameraManager.getPreviewHeight();
      if (pWidth == 0 || pHeight == 0) {
         Toast.makeText(getBaseContext(), "照相机未启动!!", Toast.LENGTH_SHORT).show();
         finish();
         return;
      }
      Log.i(TAG, pWidth + "<--------W----Preview-----H------->" + pHeight);
      Log.i(TAG, wWidth + "<--------W----WindowManager-----H------->" + wHeight);
        int pWidth = cameraManager.getPreviewWidth();
        int pHeight = cameraManager.getPreviewHeight();
        if (pWidth == 0 || pHeight == 0) {
            Toast.makeText(getBaseContext(), "照相机未启动!!", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
        Log.i(TAG, pWidth + "<--------W----Preview-----H------->" + pHeight);
        Log.i(TAG, wWidth + "<--------W----WindowManager-----H------->" + wHeight);
      int tempWidth = pWidth;
      int tempHeidht = pHeight;
      float x = 100.0f;
      int tempW = pWidth;
      int tempH = pHeight;
      if (wWidth > pWidth && wHeight > pHeight) {
         while (wWidth > tempW && wHeight > tempH) {
            x++;
            Log.d(TAG, "---xx----->" + x / 100.0);
            tempW = (int) (pWidth * x / 100.0);
            tempH = (int) (pHeight * x / 100.0);
            if (wWidth > tempW && wHeight > tempH) {
               tempWidth = tempW;
               tempHeidht = tempH;
            }
         }
         Log.d(TAG, "<------11--wWidth > pWidth && wHeight > pHeight------>");
      } else {
         while (tempWidth > wWidth || tempHeidht > wHeight) {
            x--;
            Log.d(TAG, "---xx----->" + x / 100.0);
            tempWidth = (int) (pWidth * x / 100.0);
            tempHeidht = (int) (pHeight * x / 100.0);
         }
         Log.d(TAG, "<-----22---tempWidth > wWidth || tempHeidht > wHeight------>");
      }
        int tempWidth = pWidth;
        int tempHeidht = pHeight;
        float x = 100.0f;
        int tempW = pWidth;
        int tempH = pHeight;
        if (wWidth > pWidth && wHeight > pHeight) {
            while (wWidth > tempW && wHeight > tempH) {
                x++;
                Log.d(TAG, "---xx----->" + x / 100.0);
                tempW = (int) (pWidth * x / 100.0);
                tempH = (int) (pHeight * x / 100.0);
                if (wWidth > tempW && wHeight > tempH) {
                    tempWidth = tempW;
                    tempHeidht = tempH;
                }
            }
            Log.d(TAG, "<------11--wWidth > pWidth && wHeight > pHeight------>");
        } else {
            while (tempWidth > wWidth || tempHeidht > wHeight) {
                x--;
                Log.d(TAG, "---xx----->" + x / 100.0);
                tempWidth = (int) (pWidth * x / 100.0);
                tempHeidht = (int) (pHeight * x / 100.0);
            }
            Log.d(TAG, "<-----22---tempWidth > wWidth || tempHeidht > wHeight------>");
        }
      Log.d(TAG, tempWidth + "<--------W----setParameters-----H------->" + tempHeidht);
      // tempWidth = 854;
      // tempHeidht = 480;
      ViewGroup.LayoutParams lp = sv_preview.getLayoutParams();
      lp.width = tempWidth;
      lp.height = tempHeidht;
      sv_preview.getHolder().setFixedSize(tempWidth, tempHeidht);
      sv_preview.setLayoutParams(lp);
        Log.d(TAG, tempWidth + "<--------W----setParameters-----H------->" + tempHeidht);
        // tempWidth = 854;
        // tempHeidht = 480;
        ViewGroup.LayoutParams lp = sv_preview.getLayoutParams();
        lp.width = tempWidth;
        lp.height = tempHeidht;
        sv_preview.getHolder().setFixedSize(tempWidth, tempHeidht);
        sv_preview.setLayoutParams(lp);
      surfaceHolder = sv_preview.getHolder();
      surfaceHolder.addCallback(CameraActivity.this);
      surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder = sv_preview.getHolder();
        surfaceHolder.addCallback(CameraActivity.this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      float[] img = finderView.initFinder(tempWidth, tempHeidht, mHandler, typeFront);
        float[] img = finderView.initFinder(tempWidth, tempHeidht, mHandler, typeFront);
      imgTips.setY(img[0]);
      imgTips.setX(img[1]);
        imgTips.setY(img[0]);
        imgTips.setX(img[1]);
   }
    }
   private void initView() {
      sv_preview = (SurfaceView) findViewById(R.id.camera_sv);
      finderView = (ViewfinderView) findViewById(R.id.camera_finderView);
      tvTips = (TextView) findViewById(R.id.tv_tips);
      btnCancel = (Button) findViewById(R.id.bt_cancel);
      btnFlash = (Button) findViewById(R.id.bt_flash);
      imgTips = (ImageView) findViewById(R.id.iv_tips);
      switch (typeFront) {
      case 0:
         imgTips.setVisibility(View.GONE);
         break;
      case 1:
         imgTips.setBackgroundResource(R.mipmap.people_face);
         break;
      case 2:
         imgTips.setBackgroundResource(R.mipmap.emblem);
         break;
    private void initView() {
        sv_preview = (SurfaceView) findViewById(R.id.camera_sv);
        finderView = (ViewfinderView) findViewById(R.id.camera_finderView);
        tvTips = (TextView) findViewById(R.id.tv_tips);
        btnCancel = (Button) findViewById(R.id.bt_cancel);
        btnFlash = (Button) findViewById(R.id.bt_flash);
        imgTips = (ImageView) findViewById(R.id.iv_tips);
        switch (typeFront) {
            case 0:
                imgTips.setVisibility(View.GONE);
                break;
            case 1:
                imgTips.setBackgroundResource(R.mipmap.people_face);
                break;
            case 2:
                imgTips.setBackgroundResource(R.mipmap.emblem);
                break;
      default:
         break;
      }
            default:
                break;
        }
      btnFlash.setOnClickListener(listener);
      btnCancel.setOnClickListener(listener);
   }
        btnFlash.setOnClickListener(listener);
        btnCancel.setOnClickListener(listener);
    }
   private boolean isFlashOn = false;
    private boolean isFlashOn = false;
   private OnClickListener listener = new OnClickListener() {
    private OnClickListener listener = new OnClickListener() {
      @Override
      public void onClick(View v) {
         // TODO Auto-generated method stub
         switch (v.getId()) {
         case R.id.bt_cancel:
            setResult(998);
            finish();
            break;
         case R.id.bt_flash:
            if (isFlashOn) {
               try {
                  if (cameraManager.closeFlashlight()) {
                     btnFlash.setBackgroundDrawable(getResources().getDrawable(R.mipmap.flash_on_s));
                     isFlashOn = false;
                  }
               } catch (Exception e) {
                  // TODO: handle exception
               }
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (v.getId()) {
                case R.id.bt_cancel:
                    setResult(998);
                    finish();
                    break;
                case R.id.bt_flash:
                    if (isFlashOn) {
                        try {
                            if (cameraManager.closeFlashlight()) {
                                btnFlash.setBackgroundDrawable(getResources().getDrawable(R.mipmap.flash_on_s));
                                isFlashOn = false;
                            }
                        } catch (Exception e) {
                            // TODO: handle exception
                        }
            } else {
               try {
                  if (cameraManager.openFlashlight()) {
                     btnFlash.setBackgroundDrawable(getResources().getDrawable(R.mipmap.flash_off_s));
                     isFlashOn = true;
                  }
               } catch (Exception e) {
                  // TODO: handle exception
               }
                    } else {
                        try {
                            if (cameraManager.openFlashlight()) {
                                btnFlash.setBackgroundDrawable(getResources().getDrawable(R.mipmap.flash_off_s));
                                isFlashOn = true;
                            }
                        } catch (Exception e) {
                            // TODO: handle exception
                        }
            }
            break;
                    }
                    break;
         default:
            break;
         }
      }
   };
                default:
                    break;
            }
        }
    };
   private Handler mHandler = new Handler() {
    private Handler mHandler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
         // TODO Auto-generated method stub
         super.handleMessage(msg);
         switch (msg.what) {
         case OcrConstant.TAKE_PREVIEW_DATA_OK:
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            switch (msg.what) {
                case OcrConstant.TAKE_PREVIEW_DATA_OK:
                    Log.d("yxl", "TAKE_PREVIEW_DATA_OK");
                    if (ocrManager == null) {
                        ocrManager = new OcrManager(mHandler, CameraActivity.this);
                        try {
                            rect = cameraManager.getViewfinder(finderView.getFinder());
                        } catch (Exception e) {
                            // TODO: handle exception
                            return;
                        }
            if (ocrManager == null) {
               ocrManager = new OcrManager(mHandler, CameraActivity.this);
               try {
                  rect = cameraManager.getViewfinder(finderView.getFinder());
               } catch (Exception e) {
                  // TODO: handle exception
                  return;
               }
                    }
            }
            byte[] data_p = (byte[]) msg.obj;
            if (data_p != null && data_p.length > 0) {
               // if(over){
               // return;
               // }
               ocrManager.recognIDCard(data_p, cameraManager.getPreviewWidth(), cameraManager.getPreviewHeight(),
                     rect, 0, typeFront);
               mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 100);
            } else {
               finderView.setLineRect(0);
               Toast.makeText(getBaseContext(), "相机出现问题,请重启手机!", Toast.LENGTH_SHORT).show();
               mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
            }
            break;
         case OcrConstant.RECOGN_OK:
            mHandler.removeMessages(OcrConstant.TAKE_PREVIEW_DATA_OK);
            mHandler.removeMessages(OcrConstant.START_AUTOFOCUS);
                    byte[] data_p = (byte[]) msg.obj;
                    if (data_p != null && data_p.length > 0) {
                        // if(over){
                        // return;
                        // }
                        ocrManager.recognIDCard(data_p, cameraManager.getPreviewWidth(), cameraManager.getPreviewHeight(),
                                rect, 0, typeFront);
                        mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 100);
                    } else {
                        finderView.setLineRect(0);
                        Toast.makeText(getBaseContext(), "相机出现问题,请重启手机!", Toast.LENGTH_SHORT).show();
                        mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
                    }
                    break;
                case OcrConstant.RECOGN_OK:
                    Log.d("yxl", "RECOGN_OK");
                    mHandler.removeMessages(OcrConstant.TAKE_PREVIEW_DATA_OK);
                    mHandler.removeMessages(OcrConstant.START_AUTOFOCUS);
//            String imgPath = "/sdcard/aidtest.jpg";
//            String headPath = "/sdcard/aidheadtest.jpg";
            byte[] headPath = new byte[2048 * 1024 * 3];
            byte[] imgPath = new byte[2048 * 1024 * 3];
            int[] headRect = new int[8];
            int[] imgRect = new int[8];
                    byte[] headPath = new byte[2048 * 1024 * 2];
                    byte[] imgPath = new byte[2048 * 1024 * 2];
                    int[] headRect = new int[8];
                    int[] imgRect = new int[8];
            IdCardInfoNew idCardInfo = ocrManager.getResultToByte(imgPath, imgRect, headPath, headRect);
                    IdCardInfoNew idCardInfo = ocrManager.getResultToByte(imgPath, imgRect, headPath, headRect);
                    try {
                        String OCRResult = new String(idCardInfo.getCharInfo(), "gbk");
                        Intent intent = new Intent();
                        intent.putExtra("OCRResult", OCRResult);
                        setResult(RESULT_OK, intent);
                    } catch (UnsupportedEncodingException e) {
                        throw new RuntimeException(e);
                    }
//            IdCardInfo idCardInfo = ocrManager.getResult(imgPath, headPath);
            Intent data2 = new Intent();
            data2.putExtra("idcardinfo", idCardInfo);
            setResult(200, data2);
//            AppDemo.setResult(idCardInfo);
//            Intent data2 = new Intent();
//            data2.putExtra("idcardinfo", idCardInfo);
//            setResult(200, data2);
                    finish();
                    break;
                case OcrConstant.REPEAT_AUTOFOCUS:
                    Log.d("yxl", "REPEAT_AUTOFOCUS");
            finish();
                    cameraManager.autoFoucs();
                    mHandler.sendEmptyMessageDelayed(OcrConstant.REPEAT_AUTOFOCUS, 2000);
                    break;
                case OcrConstant.RECOGN_EG_TIME_OUT:
                    Log.d("yxl", "RECOGN_EG_TIME_OUT");
                    Toast.makeText(getBaseContext(), "引擎过期,请尽快更新!", Toast.LENGTH_LONG).show();
                    finish();
                    break;
                case OcrConstant.RECOGN_EG_LICENSE:
                    Log.d("yxl", "RECOGN_EG_LICENSE");
            break;
         case OcrConstant.REPEAT_AUTOFOCUS:
            cameraManager.autoFoucs();
            mHandler.sendEmptyMessageDelayed(OcrConstant.REPEAT_AUTOFOCUS, 2000);
            break;
         case OcrConstant.RECOGN_EG_TIME_OUT:
            Toast.makeText(getBaseContext(), "引擎过期,请尽快更新!", Toast.LENGTH_LONG).show();
            finish();
            break;
         case OcrConstant.RECOGN_EG_LICENSE:
            int ret = -1;
            if (msg.obj != null) {
               ret = (Integer) msg.obj;
            }
            Toast.makeText(getBaseContext(), "授权失败-->" + ret, Toast.LENGTH_LONG).show();
            finish();
            break;
         case OcrConstant.RECOGN_EG_INIT_ERROR:
            Toast.makeText(getBaseContext(), "引擎初始化失败!", Toast.LENGTH_LONG).show();
            finish();
            break;
         case OcrConstant.START_AUTOFOCUS:
            if (autoFoucs) {
               cameraManager.autoFoucs();
               autoFoucs = false;
               mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
               mHandler.sendEmptyMessageDelayed(OcrConstant.REPEAT_AUTOFOCUS, 1500);
            } else {
               cameraManager.autoFocusAndPreviewCallback();
            }
            break;
         case OcrConstant.RECOGN_LINE_IN_RECT:
            int restult = (Integer) msg.obj;
            finderView.setLineRect(restult);
            break;
         case OcrConstant.RECOGN_TIPS:
            int tips = (Integer) msg.obj;
            switch (tips) {
            case 1000:
               tvTips.setText("请将身份证置于此区域\r\n尝试对齐边缘");
               break;
            case 1001:
               tvTips.setText("距离稍近,请尝试远点");
               break;
            case 1002:
               tvTips.setText("距离稍远,请尝试靠近");
               break;
            case 1003:
               // tvTips.setText("图像模糊,请调整距离");
               break;
            case 1004:
               tvTips.setText("图像倾斜,请保持水平拍摄");
               break;
            case 1005:
               tvTips.setText("请将身份证置于此区域\r\n尝试对齐边缘");
               break;
            case 1006:
               tvTips.setText("请将身份证正面至于此区域");
               break;
            case 1007:
               tvTips.setText("请将身份证反面至于此区域");
               break;
                    int ret = -1;
                    if (msg.obj != null) {
                        ret = (Integer) msg.obj;
                    }
                    Toast.makeText(getBaseContext(), "授权失败-->" + ret, Toast.LENGTH_LONG).show();
                    finish();
                    break;
                case OcrConstant.RECOGN_EG_INIT_ERROR:
                    Log.d("yxl", "RECOGN_EG_INIT_ERROR");
            default:
               break;
            }
                    Toast.makeText(getBaseContext(), "引擎初始化失败!", Toast.LENGTH_LONG).show();
                    finish();
                    break;
                case OcrConstant.START_AUTOFOCUS:
                    Log.d("yxl", "START_AUTOFOCUS");
            break;
         default:
            cameraManager.initDisplay();
            mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
            Toast.makeText(getBaseContext(), "<>" + msg.what, Toast.LENGTH_SHORT).show();
            break;
         }
      }
                    if (autoFoucs) {
                        cameraManager.autoFoucs();
                        autoFoucs = false;
                        mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
                        mHandler.sendEmptyMessageDelayed(OcrConstant.REPEAT_AUTOFOCUS, 1500);
                    } else {
                        cameraManager.autoFocusAndPreviewCallback();
                    }
                    break;
                case OcrConstant.RECOGN_LINE_IN_RECT:
                    Log.d("yxl", "RECOGN_LINE_IN_RECT");
   };
                    int restult = (Integer) msg.obj;
                    finderView.setLineRect(restult);
                    break;
                case OcrConstant.RECOGN_TIPS:
                    Log.d("yxl", "RECOGN_TIPS");
                    int tips = (Integer) msg.obj;
                    switch (tips) {
                        case 1000:
                            tvTips.setText("请将身份证置于此区域\r\n尝试对齐边缘");
                            break;
                        case 1001:
                            tvTips.setText("距离稍近,请尝试远点");
                            break;
                        case 1002:
                            tvTips.setText("距离稍远,请尝试靠近");
                            break;
                        case 1003:
                            // tvTips.setText("图像模糊,请调整距离");
                            break;
                        case 1004:
                            tvTips.setText("图像倾斜,请保持水平拍摄");
                            break;
                        case 1005:
                            tvTips.setText("请将身份证置于此区域\r\n尝试对齐边缘");
                            break;
                        case 1006:
                            tvTips.setText("请将身份证正面至于此区域");
                            break;
                        case 1007:
                            tvTips.setText("请将身份证反面至于此区域");
                            break;
   @Override
   public void surfaceCreated(SurfaceHolder holder) {
      // TODO Auto-generated method stub
      Log.d(TAG, "surfaceCreated");
      if (!cameraManager.cameraOpened()) {
         cameraManager.openCamera();
         setParameters();
      }
   }
                        default:
                            break;
                    }
   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
      // TODO Auto-generated method stub
      if (holder.getSurface() == null) {
         Log.d(TAG, "holder.getSurface() == null");
         return;
      }
      Log.v(TAG, "surfaceChanged. w=" + width + ". h=" + height);
      surfaceHolder = holder;
      cameraManager.setPreviewDisplay(surfaceHolder);
      cameraManager.initDisplay();
      mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
                    break;
                default:
                    Log.d("yxl", "default");
                    cameraManager.initDisplay();
                    mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
                    Toast.makeText(getBaseContext(), "<>" + msg.what, Toast.LENGTH_SHORT).show();
                    break;
            }
        }
   }
    };
   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
      // TODO Auto-generated method stub
      Log.d(TAG, "surfaceDestroyed");
      try {
         cameraManager.closeCamera();
      } catch (Exception e) {
         // TODO: handle exception
      }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        Log.d(TAG, "surfaceCreated");
        if (!cameraManager.cameraOpened()) {
            cameraManager.openCamera();
            setParameters();
        }
    }
      surfaceHolder = null;
   }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub
        if (holder.getSurface() == null) {
            Log.d(TAG, "holder.getSurface() == null");
            return;
        }
        Log.v(TAG, "surfaceChanged. w=" + width + ". h=" + height);
        surfaceHolder = holder;
        cameraManager.setPreviewDisplay(surfaceHolder);
        cameraManager.initDisplay();
        mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
   private void finishAll() {
      if (cameraManager != null) {
         try {
            cameraManager.closeCamera();
         } catch (Exception e) {
            // TODO: handle exception
         }
    }
      }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        Log.d(TAG, "surfaceDestroyed");
        try {
            cameraManager.closeCamera();
        } catch (Exception e) {
            // TODO: handle exception
        }
   }
        surfaceHolder = null;
    }
   @Override
   protected void onDestroy() {
      // TODO Auto-generated method stub
      super.onDestroy();
      mHandler.removeMessages(OcrConstant.TAKE_PREVIEW_DATA_OK);
      mHandler.removeMessages(OcrConstant.START_AUTOFOCUS);
      finishAll();
    private void finishAll() {
        if (cameraManager != null) {
            try {
                cameraManager.closeCamera();
            } catch (Exception e) {
                // TODO: handle exception
            }
   }
        }
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        mHandler.removeMessages(OcrConstant.TAKE_PREVIEW_DATA_OK);
        mHandler.removeMessages(OcrConstant.START_AUTOFOCUS);
        finishAll();
    }
}