Хочу научится работать с 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
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
String contents = phone + "/" + name + "/" + id;
BitMatrix matrix = writer.encode(contents, BarcodeFormat.QR_CODE, 512, 512, hints);
return MatrixToImageWriter.toBufferedImage(matrix);
}
Выдает картинку, которая читается всеми имеющимися у меня устройствами.
Комментариев нет:
Отправить комментарий