Страницы

Поиск по вопросам

среда, 27 февраля 2019 г.

Qr коды(создание/чтение) android

Хочу научится работать с QR кодами. Решил сделать так: создать QR, и считать QR. Для создания QR-кода, я решил использовать библиотеку zxing. Скачал zxing-1.3.jar и подключил. Все вроде работает, но когда я создаю qr с русскими символами, то мне выдает непонятную штуку, я решил ее так:
final QRCodeWriter writer = new QRCodeWriter();
//картинка где выводить ImageView tnsd_iv_qr = (ImageView)findViewById(R.id.qrImage);
//кодировка Charset charset = Charset.forName("UTF-8"); CharsetEncoder encoder = charset.newEncoder();
byte[] b = null;
try { // кодирую строку ByteBuffer bbuf = encoder.encode( CharBuffer.wrap( phone + "/" + name + "/" + id ) );
b = bbuf.array(); } catch (CharacterCodingException e) { Log.e(e.toString(), e.toString()); }
String data;
try { data = new String(b, "ISO-8859-1"); Hashtable hints = new Hashtable(2); hints.put(EncodeHintType.CHARACTER_SET, "ISO-8859-1");
ByteMatrix bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, 512, 512, hints);
int width = 512; int height = 512;
Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { if (bitMatrix.get(x, y)==0) { bmp.setPixel(x, y, Color.BLACK); } else { bmp.setPixel(x, y, Color.WHITE); } } } //создаю qr tnsd_iv_qr.setImageBitmap(bmp); } catch (WriterException | UnsupportedEncodingException e) { e.printStackTrace(); }
Проблема решилась(я так думал), русские символы зашивает, пока я не протестировал код на других устройствах, получается та же проблема с кодировкой русских символов.
Читаю я QR библиотекой ZBarScanner вот так:
//при нажатой кнопке Intent intent = new Intent(getApplicationContext(), ZBarScannerActivity.class); intent.putExtra(ZBarConstants.SCAN_MODES, new int[]{Symbol.QRCODE}); startActivityForResult(intent, ZBAR_SCANNER_REQUEST);
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { String contents = data.getStringExtra(ZBarConstants.SCAN_RESULT); int format = data.getIntExtra(ZBarConstants.SCAN_RESULT_TYPE, 0);
Log.e("add sale", contents);
if(format == 64) { setInformClient(contents); } } else if(resultCode == RESULT_CANCELED) { Toast.makeText(this, "Camera unavailable", Toast.LENGTH_SHORT).show(); } }
Хочу спросить, какие библиотеки используете вы для создание qr с использованием русских символов? И подскажите почему у меня проблема с кодировками?
UPD
При чтении некоторых qr где есть русские символы некоторые слова выводило нормально, а некоторые типа такого плана: ミ籍スムひセミス ミ漬セミサム糊エム糊コミセ (в гугл трансейт даже можно перевести =) ). Начал использовать для чтения QR библиотеку zxing, все хорошо, только не нравится что когда я запускаю на телефоне, на телефоне вместо одного приложения ставятся 2, одно мое приложение, а второе с аналогичным названием и иконкой, только когда я его запускаю то сразу включается сканер


Ответ

Судя по коду, вы:
Создаете строку в UTF-8 Преобразуете её в массив байт Читаете получившийся масив байт обратно в строку, указывая что у вас в массиве лежит строка в кодировке ISO-8859-1. И уже эту новую строку вы пишете в QR-код.
Собственно в этом и есть вся проблема. Уберите это мягко говоря странное преобразование, и тупо записывайте строку в UTF-8. Если строка содержит не латинские символы, то для записи в QR лучше использовать именно её:
private BufferedImage getQRImage(String phone, String name, int id) throws WriterException { QRCodeWriter writer = new QRCodeWriter();
Hashtable hints = new Hashtable(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
String contents = phone + "/" + name + "/" + id; BitMatrix matrix = writer.encode(contents, BarcodeFormat.QR_CODE, 512, 512, hints);
return MatrixToImageWriter.toBufferedImage(matrix); }
Выдает картинку, которая читается всеми имеющимися у меня устройствами.

Комментариев нет:

Отправить комментарий