X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=android%2Fsrc%2Fcom%2Fgoogle%2Fzxing%2Fclient%2Fandroid%2Fencode%2FQRCodeEncoder.java;h=2a130110fcb83c040c0bdac649c0c430001b885f;hb=74f7636343496fbb62ddcea0ac8c9d344898d7d4;hp=de6b904576ad278c9f6a5212414f2caf6f8b4b5c;hpb=d17bbe5600592b297e97070cd186d3faea4da46c;p=zxing.git diff --git a/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java b/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java index de6b9045..2a130110 100755 --- a/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java +++ b/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java @@ -17,6 +17,7 @@ package com.google.zxing.client.android.encode; import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.Result; import com.google.zxing.WriterException; @@ -34,7 +35,6 @@ import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Handler; -import android.os.Message; import android.provider.Contacts; import android.telephony.PhoneNumberUtils; import android.util.Log; @@ -42,6 +42,7 @@ import android.util.Log; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.util.Hashtable; /** * This class does the work of decoding the user's request and extracting all the data @@ -51,7 +52,7 @@ import java.io.InputStream; */ final class QRCodeEncoder { - private static final String TAG = "QRCodeEncoder"; + private static final String TAG = QRCodeEncoder.class.getSimpleName(); private static final int WHITE = 0xFFFFFFFF; private static final int BLACK = 0xFF000000; @@ -106,9 +107,15 @@ final class QRCodeEncoder { // but we use platform specific code like PhoneNumberUtils, so it can't. private boolean encodeContentsFromZXingIntent(Intent intent) { // Default to QR_CODE if no format given. - String format = intent.getStringExtra(Intents.Encode.FORMAT); - if (format == null || format.length() == 0 || - format.equals(Contents.Format.QR_CODE)) { + String formatString = intent.getStringExtra(Intents.Encode.FORMAT); + try { + format = BarcodeFormat.valueOf(formatString); + } catch (IllegalArgumentException iae) { + // Ignore it then + format = null; + formatString = null; + } + if (format == null || BarcodeFormat.QR_CODE.equals(format)) { String type = intent.getStringExtra(Intents.Encode.TYPE); if (type == null || type.length() == 0) { return false; @@ -121,19 +128,6 @@ final class QRCodeEncoder { contents = data; displayContents = data; title = activity.getString(R.string.contents_text); - if (format.equals(Contents.Format.CODE_128)) { - this.format = BarcodeFormat.CODE_128; - } else if (format.equals(Contents.Format.CODE_39)) { - this.format = BarcodeFormat.CODE_39; - } else if (format.equals(Contents.Format.EAN_8)) { - this.format = BarcodeFormat.EAN_8; - } else if (format.equals(Contents.Format.EAN_13)) { - this.format = BarcodeFormat.EAN_13; - } else if (format.equals(Contents.Format.UPC_A)) { - this.format = BarcodeFormat.UPC_A; - } else if (format.equals(Contents.Format.UPC_E)) { - this.format = BarcodeFormat.UPC_E; - } } } return contents != null && contents.length() > 0; @@ -311,52 +305,41 @@ final class QRCodeEncoder { } } - private static final class EncodeThread extends Thread { - private static final String TAG = "EncodeThread"; - - private final String contents; - private final Handler handler; - private final int pixelResolution; - private final BarcodeFormat format; - - EncodeThread(String contents, Handler handler, int pixelResolution, - BarcodeFormat format) { - this.contents = contents; - this.handler = handler; - this.pixelResolution = pixelResolution; - this.format = format; + static Bitmap encodeAsBitmap(String contents, + BarcodeFormat format, + int desiredWidth, + int desiredHeight) throws WriterException { + Hashtable hints = null; + String encoding = guessAppropriateEncoding(contents); + if (encoding != null) { + hints = new Hashtable(2); + hints.put(EncodeHintType.CHARACTER_SET, encoding); + } + MultiFormatWriter writer = new MultiFormatWriter(); + BitMatrix result = writer.encode(contents, format, desiredWidth, desiredHeight, hints); + int width = result.getWidth(); + int height = result.getHeight(); + int[] pixels = new int[width * height]; + // All are 0, or black, by default + for (int y = 0; y < height; y++) { + int offset = y * width; + for (int x = 0; x < width; x++) { + pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; + } } - @Override - public void run() { - try { - BitMatrix result = new MultiFormatWriter().encode(contents, format, - pixelResolution, pixelResolution); - int width = result.getWidth(); - int height = result.getHeight(); - int[] pixels = new int[width * height]; - // All are 0, or black, by default - for (int y = 0; y < height; y++) { - int offset = y * width; - for (int x = 0; x < width; x++) { - pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; - } - } + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + bitmap.setPixels(pixels, 0, width, 0, 0, width, height); + return bitmap; + } - Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - bitmap.setPixels(pixels, 0, width, 0, 0, width, height); - Message message = Message.obtain(handler, R.id.encode_succeeded); - message.obj = bitmap; - message.sendToTarget(); - } catch (WriterException e) { - Log.e(TAG, e.toString()); - Message message = Message.obtain(handler, R.id.encode_failed); - message.sendToTarget(); - } catch (IllegalArgumentException e) { - Log.e(TAG, e.toString()); - Message message = Message.obtain(handler, R.id.encode_failed); - message.sendToTarget(); + private static String guessAppropriateEncoding(CharSequence contents) { + // Very crude at the moment + for (int i = 0; i < contents.length(); i++) { + if (contents.charAt(i) > 0xFF) { + return "UTF-8"; } } + return null; } }