Beispiel #1
0
  /**
   * Decode the data within the viewfinder rectangle, and time how long it took. For efficiency,
   * reuse the same reader objects from one decode to the next.
   *
   * @param data The YUV preview frame.
   * @param width The width of the preview frame.
   * @param height The height of the preview frame.
   */
  private void decode(byte[] data, int width, int height) {
    long start = System.currentTimeMillis();
    Result rawResult = null;
    PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
    try {
      rawResult = multiFormatReader.decodeWithState(bitmap);
    } catch (ReaderException re) {
      // continue
    } finally {
      multiFormatReader.reset();
    }

    if (rawResult != null) {
      // Don't log the barcode contents for security.
      long end = System.currentTimeMillis();
      Log.d(TAG, "Found barcode in " + (end - start) + " ms");
      Message message =
          Message.obtain(activity.getHandler(), R.id.zxinglib_decode_succeeded, rawResult);
      Bundle bundle = new Bundle();
      bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());
      message.setData(bundle);
      message.sendToTarget();
    } else {
      Message message = Message.obtain(activity.getHandler(), R.id.zxinglib_decode_failed);
      message.sendToTarget();
    }
  }
 @Override
 public void handleMessage(Message message) {
   if (message.what == R.id.restart_preview) {
     Log.d(TAG, "Got restart preview message");
     restartPreviewAndDecode();
   } else if (message.what == R.id.decode_succeeded) {
     Log.d(TAG, "Got decode succeeded message");
     state = State.SUCCESS;
     Bundle bundle = message.getData();
     Bitmap barcode = null;
     float scaleFactor = 1.0f;
     if (bundle != null) {
       byte[] compressedBitmap = bundle.getByteArray(DecodeThread.BARCODE_BITMAP);
       if (compressedBitmap != null) {
         barcode =
             BitmapFactory.decodeByteArray(compressedBitmap, 0, compressedBitmap.length, null);
         // Mutable copy:
         barcode = barcode.copy(Bitmap.Config.ARGB_8888, true);
       }
       scaleFactor = bundle.getFloat(DecodeThread.BARCODE_SCALED_FACTOR);
     }
     activity.handleDecode((Result) message.obj, barcode, scaleFactor);
   } else if (message.what == R.id.decode_failed) {
     // We're decoding as fast as possible, so when one decode fails, start another.
     state = State.PREVIEW;
     cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
   } else if (message.what == R.id.return_scan_result) {
     Log.d(TAG, "Got return scan result message");
     activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
     activity.finish();
   } else if (message.what == R.id.launch_product_query) {
     Log.d(TAG, "Got product query message");
     String url = (String) message.obj;
     Intent intent = new Intent(Intent.ACTION_VIEW);
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
     intent.setData(Uri.parse(url));
     ResolveInfo resolveInfo =
         activity.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
     String browserPackageName = null;
     if (resolveInfo != null && resolveInfo.activityInfo != null) {
       browserPackageName = resolveInfo.activityInfo.packageName;
       Log.d(TAG, "Using browser in package " + browserPackageName);
     }
     // Needed for default Android browser / Chrome only apparently
     if ("com.android.browser".equals(browserPackageName)
         || "com.android.chrome".equals(browserPackageName)) {
       intent.setPackage(browserPackageName);
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       intent.putExtra(Browser.EXTRA_APPLICATION_ID, browserPackageName);
     }
     try {
       activity.startActivity(intent);
     } catch (ActivityNotFoundException ignored) {
       Log.w(TAG, "Can't find anything to handle VIEW of URI " + url);
     }
   }
 }
  @Override
  public void handleMessage(Message message) {
    switch (message.what) {
      case R.id.restart_preview:
        Log.d(TAG, "Got restart preview message");
        restartPreviewAndDecode();
        break;
      case R.id.decode_succeeded:
        Log.d(TAG, "Got decode succeeded message");
        state = State.SUCCESS;
        Bundle bundle = message.getData();
        Bitmap barcode =
            bundle == null ? null : (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);
        activity.handleDecode((Result) message.obj, barcode);
        break;
      case R.id.decode_failed:
        // We're decoding as fast as possible, so when one decode fails, start another.
        state = State.PREVIEW;
        cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
        break;
      case R.id.return_scan_result:
        Log.d(TAG, "Got return scan result message");
        activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
        activity.finish();
        break;
      case R.id.launch_product_query:
        Log.d(TAG, "Got product query message");
        String url = (String) message.obj;

        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        intent.setData(Uri.parse(url));

        ResolveInfo resolveInfo =
            activity.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
        String browserPackageName = null;
        if (resolveInfo.activityInfo != null) {
          browserPackageName = resolveInfo.activityInfo.packageName;
          Log.d(TAG, "Using browser in package " + browserPackageName);
        }

        // Needed for default Android browser only apparently
        if ("com.android.browser".equals(browserPackageName)) {
          intent.setPackage(browserPackageName);
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          intent.putExtra(Browser.EXTRA_APPLICATION_ID, browserPackageName);
        }

        try {
          activity.startActivity(intent);
        } catch (ActivityNotFoundException anfe) {
          Log.w(TAG, "Can't find anything to handle VIEW of URI " + url);
        }
        break;
    }
  }
  /**
   * Decode the data within the viewfinder rectangle, and time how long it took. For efficiency,
   * reuse the same reader objects from one decode to the next.
   *
   * @param data The YUV preview frame.
   * @param width The width of the preview frame.
   * @param height The height of the preview frame.
   */
  private void decode(byte[] data, int width, int height) {
    long start = System.currentTimeMillis();
    Result rawResult = null;
    // PlanarYUVLuminanceSource source =
    // activity.getCameraManager().buildLuminanceSource(data, width,
    // height);
    // ------------------------------------

    byte[] rotatedData = new byte[data.length];
    for (int y = 0; y < height; y++) {
      for (int x = 0; x < width; x++)
        rotatedData[x * height + height - y - 1] = data[x + y * width];
    }
    int tmp = width; // Here we are swapping, that's the difference to #11
    width = height;
    height = tmp;

    PlanarYUVLuminanceSource source =
        activity.getCameraManager().buildLuminanceSource(rotatedData, width, height);

    // ------------------------------------
    if (source != null) {
      BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
      try {
        rawResult = multiFormatReader.decodeWithState(bitmap);
      } catch (ReaderException re) {
        // continue
      } finally {
        multiFormatReader.reset();
      }
    }

    Handler handler = activity.getHandler();
    if (rawResult != null) {
      // Don't log the barcode contents for security.
      long end = System.currentTimeMillis();
      Log.d(TAG, "Found barcode in " + (end - start) + " ms");
      if (handler != null) {
        Message message = Message.obtain(handler, R.id.decode_succeeded, rawResult);
        Bundle bundle = new Bundle();
        Bitmap grayscaleBitmap = toBitmap(source, source.renderCroppedGreyscaleBitmap());
        bundle.putParcelable(DecodeThread.BARCODE_BITMAP, grayscaleBitmap);
        message.setData(bundle);
        message.sendToTarget();
      }
    } else {
      if (handler != null) {
        Message message = Message.obtain(handler, R.id.decode_failed);
        message.sendToTarget();
      }
    }
  }
  @Override
  public void handleMessage(Message message) {
    switch (message.what) {
      case R.id.auto_focus:
        // Log.d(TAG, "Got auto-focus message");
        // When one auto focus pass finishes, start another. This is the
        // closest thing to
        // continuous AF. It does seem to hunt a bit, but I'm not sure what
        // else to do.
        if (state == State.PREVIEW) {
          CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
        }
        break;
      case R.id.restart_preview:
        Log.d(TAG, "Got restart preview message");
        restartPreviewAndDecode();
        break;
      case R.id.decode_succeeded:
        Log.d(TAG, "Got decode succeeded message");
        state = State.SUCCESS;
        Bundle bundle = message.getData();

        /** ******************************************************************** */
        Bitmap barcode =
            bundle == null
                ? null
                : (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP); // ���ñ����߳�

        activity.handleDecode((Result) message.obj, barcode); // ���ؽ��
        /** ******************************************************************** */
        break;
      case R.id.decode_failed:
        // We're decoding as fast as possible, so when one decode fails,
        // start another.
        state = State.PREVIEW;
        CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
        break;
      case R.id.return_scan_result:
        Log.d(TAG, "Got return scan result message");
        activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
        activity.finish();
        break;
      case R.id.launch_product_query:
        Log.d(TAG, "Got product query message");
        String url = (String) message.obj;
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        activity.startActivity(intent);
        break;
    }
  }
 private void restartPreviewAndDecode() {
   if (state == State.SUCCESS) {
     state = State.PREVIEW;
     cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
     activity.drawViewfinder();
   }
 }
Beispiel #7
0
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    try {
      mCamera.stopPreview();
    } catch (Exception e) {
      // Don't do anything about this, since it probably won't affect the user.
    }

    // Update the preview here.
    activityContext.updatePreviewSize(width, height);

    try {
      mCamera.startPreview();
    } catch (Exception e) {
      activityContext.startPreviewFailed(e);
      return;
    }
  }
 private void restartPreviewAndDecode() {
   if (state == State.SUCCESS) {
     state = State.PREVIEW;
     CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
     CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
     activity.drawViewfinder();
   }
 }
Beispiel #9
0
 public void surfaceCreated(SurfaceHolder holder) {
   // The Surface has been created, now tell the camera where to draw the preview.
   if (mCamera != null) {
     try {
       mCamera.setPreviewDisplay(holder);
       mCamera.startPreview();
     } catch (IOException e) {
       activityContext.startPreviewFailed(e);
     }
   }
 }
 @Override
 protected void onPreExecute() {
   super.onPreExecute();
   dialog.setTitle("Please wait");
   dialog.setMessage("Checking for data installation...");
   dialog.setIndeterminate(false);
   dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
   dialog.setCancelable(false);
   dialog.show();
   activity.setButtonVisibility(false);
 }
  @Override
  protected void onPostExecute(Boolean result) {
    super.onPostExecute(result);

    try {
      indeterminateDialog.dismiss();
    } catch (IllegalArgumentException e) {
      // Catch "View not attached to window manager" error, and continue
    }

    if (result) {
      // Restart recognition
      activity.resumeOCR();
      activity.showLanguageName();
    } else {
      activity.showErrorMessage(
          "Error",
          "Network is unreachable - cannot download language data. "
              + "Please enable network access and restart this app.");
    }
  }
 public CaptureActivityHandler(
     CaptureActivity activity, Vector<BarcodeFormat> decodeFormats, String characterSet) {
   this.activity = activity;
   decodeThread =
       new DecodeThread(
           activity,
           decodeFormats,
           characterSet,
           new ViewfinderResultPointCallback(activity.getViewfinderView()));
   decodeThread.start();
   state = State.SUCCESS;
   // Start ourselves capturing previews and decoding.
   CameraManager.get().startPreview();
   restartPreviewAndDecode();
 }
 @Override
 public void handleMessage(Message message) {
   switch (message.what) {
     case Constants.ID_RESTART_PREVIEW:
       restartPreviewAndDecode();
       break;
     case Constants.ID_DECODE_SUCCESS:
       state = State.SUCCESS;
       activity.handleDecode((String) message.obj, message.getData());
       break;
     case Constants.ID_DECODE_FAILED:
       // We're decoding as fast as possible, so when one decode fails, start another.
       state = State.PREVIEW;
       cameraManager.requestPreviewFrame(decodeThread.getHandler(), Constants.ID_DECODE);
       break;
   }
 }
 /**
  * AsyncTask to asynchronously download data and initialize Tesseract.
  *
  * @param activity The calling activity
  * @param baseApi API to the OCR engine
  * @param dialog Dialog box with thermometer progress indicator
  * @param indeterminateDialog Dialog box with indeterminate progress indicator
  * @param languageCode ISO 639-2 OCR language code
  * @param languageName Name of the OCR language, for example, "English"
  * @param ocrEngineMode Whether to use Tesseract, Cube, or both
  */
 OcrInitAsyncTask(
     CaptureActivity activity,
     TessBaseAPI baseApi,
     ProgressDialog dialog,
     ProgressDialog indeterminateDialog,
     String languageCode,
     String languageName,
     int ocrEngineMode) {
   this.activity = activity;
   this.context = activity.getBaseContext();
   this.baseApi = baseApi;
   this.dialog = dialog;
   this.indeterminateDialog = indeterminateDialog;
   this.languageCode = languageCode;
   this.languageName = languageName;
   this.ocrEngineMode = ocrEngineMode;
 }
  CaptureActivityHandler(
      CaptureActivity activity,
      Collection<BarcodeFormat> decodeFormats,
      Map<DecodeHintType, ?> baseHints,
      String characterSet,
      CameraManager cameraManager) {
    this.activity = activity;
    decodeThread =
        new DecodeThread(
            activity,
            decodeFormats,
            baseHints,
            characterSet,
            new ViewfinderResultPointCallback(activity.getViewfinderView()));
    decodeThread.start();
    state = State.SUCCESS;

    // Start ourselves capturing previews and decoding.
    this.cameraManager = cameraManager;
    cameraManager.startPreview();
    restartPreviewAndDecode();
  }