Страницы

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

пятница, 10 января 2020 г.

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

#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");
    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,
одно мое приложение, а второе с аналогичным названием и иконкой, только когда я его
запускаю то сразу включается сканер 
    


Ответы

Ответ 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(); 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); } Выдает картинку, которая читается всеми имеющимися у меня устройствами.

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

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