45

I need to generate 1D barcode image and set it to ImageView according to given 13-character code. Can anyone help me with this please?

Grant Thomas
  • 42,191
  • 8
  • 81
  • 120
Leonidas
  • 573
  • 1
  • 5
  • 13
  • there are many different 1D barcode formats...Is there a specific one you are hoping to generate? – FoamyGuy Apr 27 '12 at 22:44
  • First, thank you for your answer... Hm, not sure what you mean, does EAN13 mean something to you? The point is, i'm getting the 13-character (numbers actually) code that represents the code and now I need to generate image (drawable) so I can show it on the screen... that's all, I don't need to generate code itself, I already have that part... – Leonidas Apr 28 '12 at 10:30
  • related: http://stackoverflow.com/q/8800919/813951 – Mister Smith Aug 20 '13 at 11:05

4 Answers4

150

You can use zxing library to generate barcode easily.

first, locate core.jar under libs folder.

libs/core.jar

You can download ZXing-2.1.zip from here.

http://repo1.maven.org/maven2/com/google/zxing/ (source)

After unzipping the file, find the jar file.

\ZXing-2.1\zxing-2.1\core\core.jar

And then write your own code like below.

import java.util.EnumMap;
import java.util.Map;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;

public class BarcodeExampleActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout l = new LinearLayout(this);
    l.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    l.setOrientation(LinearLayout.VERTICAL);

    setContentView(l);

    // barcode data
    String barcode_data = "123456";

    // barcode image
    Bitmap bitmap = null;
    ImageView iv = new ImageView(this);

    try {

        bitmap = encodeAsBitmap(barcode_data, BarcodeFormat.CODE_128, 600, 300);
        iv.setImageBitmap(bitmap);

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

    l.addView(iv);

    //barcode text
    TextView tv = new TextView(this);
    tv.setGravity(Gravity.CENTER_HORIZONTAL);
    tv.setText(barcode_data);

    l.addView(tv);

    }

    /**************************************************************
     * getting from com.google.zxing.client.android.encode.QRCodeEncoder
     * 
     * See the sites below
     * http://code.google.com/p/zxing/
     * http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/encode/EncodeActivity.java
     * http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java
     */

    private static final int WHITE = 0xFFFFFFFF;
    private static final int BLACK = 0xFF000000;

    Bitmap encodeAsBitmap(String contents, BarcodeFormat format, int img_width, int img_height) throws WriterException {
    String contentsToEncode = contents;
    if (contentsToEncode == null) {
        return null;
    }
    Map<EncodeHintType, Object> hints = null;
    String encoding = guessAppropriateEncoding(contentsToEncode);
    if (encoding != null) {
        hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
        hints.put(EncodeHintType.CHARACTER_SET, encoding);
    }
    MultiFormatWriter writer = new MultiFormatWriter();
    BitMatrix result;
    try {
        result = writer.encode(contentsToEncode, format, img_width, img_height, hints);
    } catch (IllegalArgumentException iae) {
        // Unsupported format
        return null;
    }
    int width = result.getWidth();
    int height = result.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] = result.get(x, y) ? BLACK : WHITE;
        }
    }

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

    private static String guessAppropriateEncoding(CharSequence contents) {
    // Very crude at the moment
    for (int i = 0; i < contents.length(); i++) {
        if (contents.charAt(i) > 0xFF) {
        return "UTF-8";
        }
    }
    return null;
    }

}
Cœur
  • 32,421
  • 21
  • 173
  • 232
pretty angela
  • 2,221
  • 1
  • 16
  • 8
  • Very nice, was looking for a way to do this with generating the usual qr codes. – Muz Jun 02 '13 at 06:51
  • Its really nice , But I want send the list of data like Full Name , First Name, Last Name , Mobile Number, Address, City State, Country, Zip Code. Then Can I do this . Please Help me. – Aadi Aug 28 '13 at 11:43
  • 8
    It seems that compiled JARs are now located in the Maven release repository: http://repo1.maven.org/maven2/com/google/zxing/ – eigenein Apr 30 '14 at 09:22
  • @pretty angela this code is working fine when i m trying for barcode but when i m scanning QR code and move to next screen to get bitmap its not returning me how can i resolve this issue ? – Erum Jan 26 '15 at 12:56
  • Here is the barcode format is set to CODE_128, I will need it in EAN_13 Format, so can anyone help me? I have already tried to replace CODE_128 with EAN_13. – Kishan B Manavadariya Feb 11 '16 at 16:09
  • It works for me with zxing core 3.2.1 http://repo1.maven.org/maven2/com/google/zxing/core/ Also EAN_13. @KishanBManavadariya are you sure that the code you are testing is a correct EAN_13 code? – Hugo Matilla Aug 30 '16 at 16:32
  • @Hugo Thanks. I solved it by using latest version of the ZXing. – Kishan B Manavadariya Sep 02 '16 at 05:56
  • @eigenein you can fix broken links directly with a suggested edit :) – Cœur Sep 10 '17 at 17:13
  • @pretty_angela, Thanks for the sample code, but do you have a documentation reference that you used to generate this? I'm not finding anything but the javadoc. Is there something more oriented towards an introduction of use in android? The core docs linked on the [github page](https://zxing.github.io/zxing/core/index.html) shows a 404 error. – topher217 Jan 05 '21 at 09:15
  • It's generating the barcode but its not showing the barcode number under the bars. Can anyone help me with that? Thanks – Syed Arsalan Kazmi Feb 05 '21 at 10:49
3

Thanks for your answers guys... In the meantime I found solution so here is what I used: http://www.onbarcode.com/products/android_barcode/barcodes/ean13.html It's a library that worked fine for me so if anyone has the same issue I suggest using it.

Thanks again!

Leonidas
  • 573
  • 1
  • 5
  • 13
3
public Bitmap Ean13_Encode(String qrData,  int qrCodeDimention) {
    Bitmap bitmap= Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);       
    QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(qrData, null,
    Contents.Type.TEXT, BarcodeFormat.EAN_13.toString(), qrCodeDimention);
    try {
        bitmap = qrCodeEncoder.encodeAsBitmap();
    } catch (WriterException e) {
        e.printStackTrace();
    };
    return bitmap;
};

public final class QRCodeEncoder {
private static final int WHITE = 0xFFFFFFFF;
private static final int BLACK = 0xFF000000;

private int dimension = Integer.MIN_VALUE;
private String contents = null;
private String displayContents = null;
private String title = null;
private BarcodeFormat format = null;
private boolean encoded = false;

public QRCodeEncoder(String data, Bundle bundle, String type, String format, int dimension) {
    this.dimension = dimension;
    encoded = encodeContents(data, bundle, type, format);
}

public String getContents() {
    return contents;
}

public String getDisplayContents() {
    return displayContents;
}

public String getTitle() {
    return title;
}

private boolean encodeContents(String data, Bundle bundle, String type, String formatString) {
    // Default to QR_CODE if no format given.
    format = null;
    if (formatString != null) {
        try {
            format = BarcodeFormat.valueOf(formatString);
        } catch (IllegalArgumentException iae) {
            // Ignore it then
        }
    }
    if (format == null || format == BarcodeFormat.QR_CODE) {
        this.format = BarcodeFormat.QR_CODE;
        encodeQRCodeContents(data, bundle, type);
    } else if (data != null && data.length() > 0) {
        contents = data;
        displayContents = data;
        title = "Text";
    }
    return contents != null && contents.length() > 0;
}

private void encodeQRCodeContents(String data, Bundle bundle, String type) {
    if (type.equals(Contents.Type.TEXT)) {
        if (data != null && data.length() > 0) {
            contents = data;
            displayContents = data;
            title = "Text";
        }
    } else if (type.equals(Contents.Type.EMAIL)) {
        data = trim(data);
        if (data != null) {
            contents = "mailto:" + data;
            displayContents = data;
            title = "E-Mail";
        }
    } else if (type.equals(Contents.Type.PHONE)) {
        data = trim(data);
        if (data != null) {
            contents = "tel:" + data;
            displayContents = PhoneNumberUtils.formatNumber(data);
            title = "Phone";
        }
    } else if (type.equals(Contents.Type.SMS)) {
        data = trim(data);
        if (data != null) {
            contents = "sms:" + data;
            displayContents = PhoneNumberUtils.formatNumber(data);
            title = "SMS";
        }
    } else if (type.equals(Contents.Type.CONTACT)) {
        if (bundle != null) {
            StringBuilder newContents = new StringBuilder(100);
            StringBuilder newDisplayContents = new StringBuilder(100);

            newContents.append("MECARD:");

            String name = trim(bundle.getString(ContactsContract.Intents.Insert.NAME));
            if (name != null) {
                newContents.append("N:").append(escapeMECARD(name)).append(';');
                newDisplayContents.append(name);
            }

            String address = trim(bundle.getString(ContactsContract.Intents.Insert.POSTAL));
            if (address != null) {
                newContents.append("ADR:").append(escapeMECARD(address)).append(';');
                newDisplayContents.append('\n').append(address);
            }

            Collection<String> uniquePhones = new HashSet<String>(Contents.PHONE_KEYS.length);
            for (int x = 0; x < Contents.PHONE_KEYS.length; x++) {
                String phone = trim(bundle.getString(Contents.PHONE_KEYS[x]));
                if (phone != null) {
                    uniquePhones.add(phone);
                }
            }
            for (String phone : uniquePhones) {
                newContents.append("TEL:").append(escapeMECARD(phone)).append(';');
                newDisplayContents.append('\n').append(PhoneNumberUtils.formatNumber(phone));
            }

            Collection<String> uniqueEmails = new HashSet<String>(Contents.EMAIL_KEYS.length);
            for (int x = 0; x < Contents.EMAIL_KEYS.length; x++) {
                String email = trim(bundle.getString(Contents.EMAIL_KEYS[x]));
                if (email != null) {
                    uniqueEmails.add(email);
                }
            }
            for (String email : uniqueEmails) {
                newContents.append("EMAIL:").append(escapeMECARD(email)).append(';');
                newDisplayContents.append('\n').append(email);
            }

            String url = trim(bundle.getString(Contents.URL_KEY));
            if (url != null) {
                // escapeMECARD(url) -> wrong escape e.g. http\://zxing.google.com
                newContents.append("URL:").append(url).append(';');
                newDisplayContents.append('\n').append(url);
            }

            String note = trim(bundle.getString(Contents.NOTE_KEY));
            if (note != null) {
                newContents.append("NOTE:").append(escapeMECARD(note)).append(';');
                newDisplayContents.append('\n').append(note);
            }

            // Make sure we've encoded at least one field.
            if (newDisplayContents.length() > 0) {
                newContents.append(';');
                contents = newContents.toString();
                displayContents = newDisplayContents.toString();
                title = "Contact";
            } else {
                contents = null;
                displayContents = null;
            }

        }
    } else if (type.equals(Contents.Type.LOCATION)) {
        if (bundle != null) {
            // These must use Bundle.getFloat(), not getDouble(), it's part of the API.
            float latitude = bundle.getFloat("LAT", Float.MAX_VALUE);
            float longitude = bundle.getFloat("LONG", Float.MAX_VALUE);
            if (latitude != Float.MAX_VALUE && longitude != Float.MAX_VALUE) {
                contents = "geo:" + latitude + ',' + longitude;
                displayContents = latitude + "," + longitude;
                title = "Location";
            }
        }
    }
}

public Bitmap encodeAsBitmap() throws WriterException {
    if (!encoded) return null;

    Map<EncodeHintType, Object> hints = null;
    String encoding = guessAppropriateEncoding(contents);
    if (encoding != null) {
        hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
        hints.put(EncodeHintType.CHARACTER_SET, encoding);
    }
    MultiFormatWriter writer = new MultiFormatWriter();
    BitMatrix result = writer.encode(contents, format, dimension, dimension, hints);
    int width = result.getWidth();
    int height = result.getHeight();
    int[] pixels = new int[width * height];
    // All are 0, or black, by default
    for (int y = 0; y < height; y++) {
        int offset = y * width;
        for (int x = 0; x < width; x++) {
            pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
        }
    }

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

private String guessAppropriateEncoding(CharSequence contents) {
    // Very crude at the moment
    for (int i = 0; i < contents.length(); i++) {
        if (contents.charAt(i) > 0xFF) { return "UTF-8"; }
    }
    return null;
}

private  String trim(String s) {
    if (s == null) { return null; }
    String result = s.trim();
    return result.length() == 0 ? null : result;
}

private String escapeMECARD(String input) {
    if (input == null || (input.indexOf(':') < 0 && input.indexOf(';') < 0)) { return input; }
    int length = input.length();
    StringBuilder result = new StringBuilder(length);
    for (int i = 0; i < length; i++) {
        char c = input.charAt(i);
        if (c == ':' || c == ';') {
            result.append('\\');
        }
        result.append(c);
    }
    return result.toString();
}

}

Rahul Rana
  • 55
  • 7
  • I don't see new QRCodeEncoder(qrData, null, Contents.Type.TEXT, BarcodeFormat.EAN_13.toString(), qrCodeDimention); constructor in ZXing 2.3.0 version. Which version do you use? – pstrag Mar 21 '14 at 12:04
  • hey Tomasz, I added the code of QRCodeEncoder(qrData, null, Contents.Type.TEXT, BarcodeFormat.EAN_13.toString(), qrCodeDimention); , please check and let me know if you face any problen with this.a – Rahul Rana Mar 21 '14 at 12:43
0

Check out the answer on: Generate 1D barcode in Android

They suggest using IText which is a java PDF manipulation library. That also has the capability to generate barcode images.

You can find sample code in that question that I linked and also here

Community
  • 1
  • 1
FoamyGuy
  • 45,328
  • 16
  • 118
  • 151
  • Tim, thanks for suggestion, I did try with iText at first but I couldn't get rid of pdf-document. In order to use "createImage..." methods, seems like you have to create a pdf which was not an option for me... (or perhaps I didn't dig deep enough) – Leonidas Apr 30 '12 at 08:30