#java #android #qr
Хочу научится работать с 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"); Hashtablehints = 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, одно мое приложение, а второе с аналогичным названием и иконкой, только когда я его запускаю то сразу включается сканер
Ответы
Ответ 1
Судя по коду, вы: Создаете строку в UTF-8 Преобразуете её в массив байт Читаете получившийся масив байт обратно в строку, указывая что у вас в массиве лежит строка в кодировке ISO-8859-1. И уже эту новую строку вы пишете в QR-код. Собственно в этом и есть вся проблема. Уберите это мягко говоря странное преобразование, и тупо записывайте строку в UTF-8. Если строка содержит не латинские символы, то для записи в QR лучше использовать именно её: private BufferedImage getQRImage(String phone, String name, int id) throws WriterException { QRCodeWriter writer = new QRCodeWriter(); Hashtablehints = 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); } Выдает картинку, которая читается всеми имеющимися у меня устройствами.
Комментариев нет:
Отправить комментарий