X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=android%2Fsrc%2Fcom%2Fgoogle%2Fzxing%2Fclient%2Fandroid%2FDecodeThread.java;h=75e5bad74da92cb40fa39040d984689c7bdaa28f;hb=b320f70e522f4f2c126cf2e3ff5d8db7b64fb62c;hp=a7242ec6df616131edc07b5dea1622a0d61a8217;hpb=462c02d414d68a857a00f83844d3ddf08e34966f;p=zxing.git diff --git a/android/src/com/google/zxing/client/android/DecodeThread.java b/android/src/com/google/zxing/client/android/DecodeThread.java index a7242ec6..75e5bad7 100755 --- a/android/src/com/google/zxing/client/android/DecodeThread.java +++ b/android/src/com/google/zxing/client/android/DecodeThread.java @@ -17,24 +17,17 @@ package com.google.zxing.client.android; import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; import com.google.zxing.DecodeHintType; -import com.google.zxing.MultiFormatReader; -import com.google.zxing.ReaderException; -import com.google.zxing.Result; import com.google.zxing.ResultPointCallback; -import com.google.zxing.common.HybridBinarizer; import android.content.SharedPreferences; -import android.os.Bundle; import android.os.Handler; import android.os.Looper; -import android.os.Message; import android.preference.PreferenceManager; -import android.util.Log; import java.util.Hashtable; import java.util.Vector; +import java.util.concurrent.CountDownLatch; /** * This thread does all the heavy lifting of decoding the images. @@ -44,19 +37,21 @@ import java.util.Vector; final class DecodeThread extends Thread { public static final String BARCODE_BITMAP = "barcode_bitmap"; - private static final String TAG = "DecodeThread"; - private Handler handler; private final CaptureActivity activity; - private final MultiFormatReader multiFormatReader; - private final ResultPointCallback resultPointCallback; + private final Hashtable hints; + private Handler handler; + private final CountDownLatch handlerInitLatch; DecodeThread(CaptureActivity activity, Vector decodeFormats, + String characterSet, ResultPointCallback resultPointCallback) { + this.activity = activity; - multiFormatReader = new MultiFormatReader(); - this.resultPointCallback = resultPointCallback; + handlerInitLatch = new CountDownLatch(1); + + hints = new Hashtable(3); // The prefs can't change while the thread is running, so pick them up once here. if (decodeFormats == null || decodeFormats.isEmpty()) { @@ -64,81 +59,38 @@ final class DecodeThread extends Thread { boolean decode1D = prefs.getBoolean(PreferencesActivity.KEY_DECODE_1D, true); boolean decodeQR = prefs.getBoolean(PreferencesActivity.KEY_DECODE_QR, true); if (decode1D && decodeQR) { - doSetDecodeMode(CaptureActivity.ALL_FORMATS); + hints.put(DecodeHintType.POSSIBLE_FORMATS, CaptureActivity.ALL_FORMATS); } else if (decode1D) { - doSetDecodeMode(CaptureActivity.ONE_D_FORMATS); + hints.put(DecodeHintType.POSSIBLE_FORMATS, CaptureActivity.ONE_D_FORMATS); } else if (decodeQR) { - doSetDecodeMode(CaptureActivity.QR_CODE_FORMATS); + hints.put(DecodeHintType.POSSIBLE_FORMATS, CaptureActivity.QR_CODE_FORMATS); } } else { - doSetDecodeMode(decodeFormats); + hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats); + } + + if (characterSet != null) { + hints.put(DecodeHintType.CHARACTER_SET, characterSet); } + + hints.put(DecodeHintType.NEED_RESULT_POINT_CALLBACK, resultPointCallback); } Handler getHandler() { + try { + handlerInitLatch.await(); + } catch (InterruptedException ie) { + // continue? + } return handler; } @Override public void run() { Looper.prepare(); - handler = new Handler() { - @Override - public void handleMessage(Message message) { - switch (message.what) { - case R.id.decode: - decode((byte[]) message.obj, message.arg1, message.arg2); - break; - case R.id.quit: - Looper.myLooper().quit(); - break; - } - } - }; + handler = new DecodeHandler(activity, hints); + handlerInitLatch.countDown(); Looper.loop(); } - private void doSetDecodeMode(Vector vector) { - Hashtable hints = new Hashtable(3); - if (vector != null) { - hints.put(DecodeHintType.POSSIBLE_FORMATS, vector); - } - hints.put(DecodeHintType.NEED_RESULT_POINT_CALLBACK, resultPointCallback); - multiFormatReader.setHints(hints); - } - - /** - * 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) { - long end = System.currentTimeMillis(); - Log.v(TAG, "Found barcode (" + (end - start) + " ms):\n" + rawResult.toString()); - Message message = Message.obtain(activity.getHandler(), R.id.decode_succeeded, rawResult); - Bundle bundle = new Bundle(); - bundle.putParcelable(BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap()); - message.setData(bundle); - message.sendToTarget(); - } else { - Message message = Message.obtain(activity.getHandler(), R.id.decode_failed); - message.sendToTarget(); - } - } }