X-Git-Url: http://git.rot13.org/?p=zxing.git;a=blobdiff_plain;f=android%2Fsrc%2Fcom%2Fgoogle%2Fzxing%2Fclient%2Fandroid%2Fencode%2FQRCodeEncoder.java;h=ab2e421533069bcaf2b59a459cc81f9835308441;hp=41f3c5b119f936633995078d52825e0041ad5329;hb=cce6f2a796765554458e0db234b44056323a10de;hpb=53318db0aa32fc64659dac58ffea58265a8b3251 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 41f3c5b1..ab2e4215 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,14 +35,13 @@ 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; -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 @@ -139,23 +139,34 @@ final class QRCodeEncoder { Uri uri = (Uri)intent.getExtras().getParcelable(Intent.EXTRA_STREAM); InputStream stream = activity.getContentResolver().openInputStream(uri); int length = stream.available(); + if (length <= 0) { + Log.w(TAG, "Content stream is empty"); + return false; + } byte[] vcard = new byte[length]; - stream.read(vcard, 0, length); - String vcardString = new String(vcard, "UTF-8"); - Log.d(TAG, "Encoding share intent content: " + vcardString); + int bytesRead = stream.read(vcard, 0, length); + if (bytesRead < length) { + Log.w(TAG, "Unable to fully read available bytes from content stream"); + return false; + } + String vcardString = new String(vcard, 0, bytesRead, "UTF-8"); + Log.d(TAG, "Encoding share intent content:"); + Log.d(TAG, vcardString); Result result = new Result(vcardString, vcard, null, BarcodeFormat.QR_CODE); ParsedResult parsedResult = ResultParser.parseResult(result); if (!(parsedResult instanceof AddressBookParsedResult)) { + Log.d(TAG, "Result was not an address"); return false; } if (!encodeQRCodeContents((AddressBookParsedResult) parsedResult)) { + Log.d(TAG, "Unable to encode contents"); return false; } - } catch (FileNotFoundException e) { - return false; } catch (IOException e) { + Log.w(TAG, e); return false; } catch (NullPointerException e) { + Log.w(TAG, e); // In case the uri was not found in the Intent. return false; } @@ -258,17 +269,16 @@ final class QRCodeEncoder { } String[] addresses = contact.getAddresses(); if (addresses != null) { - for (int x = 0; x < addresses.length; x++) { - if (addresses[x] != null && addresses[x].length() > 0) { - newContents.append("ADR:").append(addresses[x]).append(';'); - newDisplayContents.append('\n').append(addresses[x]); + for (String address : addresses) { + if (address != null && address.length() > 0) { + newContents.append("ADR:").append(address).append(';'); + newDisplayContents.append('\n').append(address); } } } String[] phoneNumbers = contact.getPhoneNumbers(); if (phoneNumbers != null) { - for (int x = 0; x < phoneNumbers.length; x++) { - String phone = phoneNumbers[x]; + for (String phone : phoneNumbers) { if (phone != null && phone.length() > 0) { newContents.append("TEL:").append(phone).append(';'); newDisplayContents.append('\n').append(PhoneNumberUtils.formatNumber(phone)); @@ -277,8 +287,7 @@ final class QRCodeEncoder { } String[] emails = contact.getEmails(); if (emails != null) { - for (int x = 0; x < emails.length; x++) { - String email = emails[x]; + for (String email : emails) { if (email != null && email.length() > 0) { newContents.append("EMAIL:").append(email).append(';'); newDisplayContents.append('\n').append(email); @@ -308,8 +317,14 @@ final class QRCodeEncoder { BarcodeFormat format, int desiredWidth, int desiredHeight) throws WriterException { - BitMatrix result = new MultiFormatWriter().encode(contents, format, - desiredWidth, desiredHeight); + 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]; @@ -326,39 +341,13 @@ final class QRCodeEncoder { return bitmap; } - private static final class EncodeThread extends Thread { - - private static final String TAG = EncodeThread.class.getSimpleName(); - - 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; - } - - @Override - public void run() { - try { - Bitmap bitmap = encodeAsBitmap(contents, format, pixelResolution, pixelResolution); - 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; } }