Как сгенерировать QR-код для Android-приложения? [закрыто]


92

Мне нужно создать qrcode в моем приложении для Android, и мне нужна библиотека или исходный код, которые позволяют мне создавать QR-код в приложении для Android.

Нужная мне библиотека должна:

  1. не оставлять водяных знаков (как в onbarcodeбиблиотеке)
  2. не использовать API веб-службы для создания qrcode (например, zxing библиотеки Google)
  3. не нужны сторонние установщики (например, QR Droid)

Я уже создал такой код для iPhone (Objective-C), но мне нужно быстрое исправление для Android, пока у меня не будет времени создать собственный генератор QR-кода. Это мой первый проект для Android, поэтому мы будем благодарны за любую помощь.


вы можете использовать zxing с открытым исходным кодом
nandeesh

2
zxing - это не веб-API, на самом деле, см. ниже
Шон Оуэн,

1
Попробуйте мое простое тестовое приложение для создания растрового изображения QR здесь: stackoverflow.com/a/30529519/165071
Александр Фарбер

Ответы:


68

Вы смотрели ZXING ? Я успешно использую его для создания штрих-кодов. Вы можете увидеть полный рабочий пример в биткойн-приложении src

// this is a small sample use of the QRCodeEncoder class from zxing
try {
    // generate a 150x150 QR code
    Bitmap bm = encodeAsBitmap(barcode_content, BarcodeFormat.QR_CODE, 150, 150);

    if(bm != null) {
        image_view.setImageBitmap(bm);
    }
} catch (WriterException e) { //eek }

Я разветвил биткойн с открытым исходным кодом из github и опробовал его на своих устройствах Android 2.2, приложение принудительно закрыто, что-то не так?
Рой Ли

Извините, я не смотрел это приложение больше года. Как упомянуто ниже Шоном, проверьте источник кодировщика zxing здесь: code.google.com/p/zxing/source/browse/trunk#trunk/core/src/com/…
Роб

@Rob он сгенерирует QR-код определенного пользователем номера? только число или число с лапабетами
Эрум

@Erum создаст штрих-код для любых буквенно-цифровых строк, которые вы предоставите,
Роб

Используйте это: реализация 'me.dm7.barcodescanner: zxing: 1.9.13'
М. Усман Хан

97

с zxing это мой код для создания QR

 QRCodeWriter writer = new QRCodeWriter();
    try {
        BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, 512, 512);
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                bmp.setPixel(x, y, bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE);
            }
        }
        ((ImageView) findViewById(R.id.img_result_qr)).setImageBitmap(bmp);

    } catch (WriterException e) {
        e.printStackTrace();
    }

Работал у меня. Легко добавить.
Roon13 01

Спасибо вам. Работай на меня.
RoShan Shan

@Stefano Может он сгенерировать нет. уникального QR-кода?
Ашиш Тивари

Работал шарм g88 !! +1 Есть ли вариант, в котором я могу добавить к этому логотип?
Амит

1
чтобы избежать утечек памяти, не забывайте управлять памятью растровых изображений , которая создается Bitmap.createBitmap.
gMale

43

Возможно, эта старая тема, но я обнаружил, что эта библиотека очень полезна и проста в использовании

QRGen

пример для использования в android

 Bitmap myBitmap = QRCode.from("www.example.org").bitmap();
ImageView myImage = (ImageView) findViewById(R.id.imageView);
myImage.setImageBitmap(myBitmap);

2
Это простое и рабочее решение!
Зохаб Али

5
.bitmap () не найден
Марсель Адель

Вы должны использовать зависимость Android: implementation 'com.github.kenglxn.QRGen:android:[version]' и импортировать класс QRCode следующим образом:import net.glxn.qrgen.android.QRCode
anro

2
Не удалось разрешить: com.github.kenglxn.QRGen: android: 2.6.0
М. Усман Хан

2
В вашем проекте build.gradle добавьте maven {url " jitpack.io "} в allprojects.repositiories
tagy22

18

Вот моя простая и рабочая функция для создания растрового изображения! Я использую только ZXing1.3.jar! Я также установил высокий уровень коррекции!

PS: x и y меняются местами, это нормально, потому что bitMatrix меняет местами x и y. Этот код отлично работает с квадратным изображением.

public static Bitmap generateQrCode(String myCodeText) throws WriterException {
    Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
    hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // H = 30% damage

    QRCodeWriter qrCodeWriter = new QRCodeWriter();

    int size = 256;

    ByteMatrix bitMatrix = qrCodeWriter.encode(myCodeText,BarcodeFormat.QR_CODE, size, size, hintMap);
    int width = bitMatrix.width();
    Bitmap bmp = Bitmap.createBitmap(width, width, Bitmap.Config.RGB_565);
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < width; y++) {
            bmp.setPixel(y, x, bitMatrix.get(x, y)==0 ? Color.BLACK : Color.WHITE);
        }
    }
    return bmp;
}

РЕДАКТИРОВАТЬ

Быстрее использовать bitmap.setPixels (...) с массивом int пикселей вместо bitmap.setPixel один за другим:

        BitMatrix bitMatrix = writer.encode(inputValue, BarcodeFormat.QR_CODE, size, size);
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        int[] pixels = new int[width * height];
        for (int y = 0; y < height; y++) {
            int offset = y * width;
            for (int x = 0; x < width; x++) {
                pixels[offset + x] = bitMatrix.get(x, y) ? BLACK : WHITE;
            }
        }

        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

12

Я использовал zxing-1.3 jar, и мне пришлось внести некоторые изменения, реализующие код из других ответов, поэтому я оставлю свое решение другим. Я сделал следующее:

1) найдите zxing-1.3.jar, загрузите его и добавьте свойства (добавьте внешний jar).

2) в моем макете активности добавьте ImageView и назовите его (в моем примере это было tnsd_iv_qr).

3) включить код в мою деятельность для создания изображения qr (в этом примере я создавал QR для платежей в биткойнах):

    QRCodeWriter writer = new QRCodeWriter();
    ImageView tnsd_iv_qr = (ImageView)findViewById(R.id.tnsd_iv_qr);
    try {
        ByteMatrix bitMatrix = writer.encode("bitcoin:"+btc_acc_adress+"?amount="+amountBTC, BarcodeFormat.QR_CODE, 512, 512);
        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);
            }
        }
        tnsd_iv_qr.setImageBitmap(bmp);
    } catch (WriterException e) {
        //Log.e("QR ERROR", ""+e);

    }

Если кому-то интересно, переменная «btc_acc_adress» - это строка (с адресом BTC), amountBTC - двойная, с, конечно, суммой транзакции.


Используйте это: реализация 'me.dm7.barcodescanner: zxing: 1.9.13'
М. Усман Хан

5

zxing не (только) предоставляет веб-API; на самом деле это Google, предоставляющий API из исходного кода, который позже был открыт в проекте.

Как говорит здесь Роб, вы можете использовать исходный код Java для кодировщика QR-кода, чтобы создать необработанный штрих-код, а затем отобразить его как растровое изображение.

Я могу предложить еще более простой способ. Вы можете вызвать сканер штрих-кода по намерению для кодирования штрих-кода. Вам понадобится всего несколько строк кода и два класса из проекта в разделе android-integration. Главный из них - IntentIntegrator . Просто позвони shareText().


tank, это кажется полезным, только я надеюсь обойти любые веб-API, которые могут быть немного неудобными, в автономном режиме для моего приложения, но это очень многообещающе, я посмотрю на него
Radu

Не уверен, что я ясно выразился, но я говорю, что параметры zxing не связаны с какими-либо веб-API,
Шон Оуэн,

Нет, он использует некоторые библиотеки, недоступные для Android, например java.awt
siemanko 09

Привет, извините за некро эту ветку, я думаю, что лучше, если я просто задам здесь вопрос. У меня есть приложение сканера штрих-кода от вас, ребята (я использую его для сканирования QR-кода), и если я получу этот ответ правильно, я могу просто сделать то же самое, открыть сканер штрих-кода с помощью намерения с разными аргументами, и он вернет Bitmap QR Code для отображения?
Разгриз,

1
@nivwusquorum, нет, кодировщик не использует java.awtи не подключается к Интернету, и вы можете увидеть, что он используется в приложении Barcode Scanner - на Android, без подключения к Интернету. @Razgriz нет, он не возвращает изображение, но показывает изображение на экране для вас. Пользователь может сохранить изображение.
Шон Оуэн,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.