2012-04-27 2 views
36

Мне нужно сгенерировать 1D-изображение штрих-кода и установить его в ImageView согласно заданному 13-символьному коду. Может ли кто-нибудь помочь мне с этим, пожалуйста?Создание изображения штрих-кода в приложении для Android

+0

существует множество различных форматов 1D штрих-кодов ... Есть ли конкретные один вы надеетесь генерировать? – FoamyGuy

+0

Во-первых, спасибо за ваш ответ ... Хм, не уверен, что вы имеете в виду, что-то для вас значит EAN13? Дело в том, что я получаю 13-символьный код (код на самом деле), который представляет код, и теперь мне нужно сгенерировать изображение (рисовать), чтобы я мог показать его на экране ... вот и все, мне не нужно чтобы генерировать код сам, у меня уже есть эта часть ... – Leonidas

+0

related: http://stackoverflow.com/q/8800919/813951 –

ответ

0

Спасибо за ваши ответы, ребята ... В то же время я нашел решение, так вот что я использовал: http://www.onbarcode.com/products/android_barcode/barcodes/ean13.html Это библиотека, которая работала отлично подходит для так что, если у кого-то есть такая же проблема, я предлагаю использовать ее.

Еще раз спасибо!

+1

Как вы установили штрих-код в изображение? –

0

Заканчивать ответ на: Generate 1D barcode in Android

Они предлагают при помощи IText который представляет собой библиотеку Java PDF манипуляция. Это также имеет возможность генерировать изображения штрих-кода.

Вы можете найти образец кода в этом вопросе, что я связан and also here

+0

Тим, спасибо за предложение, я сначала попытался с iText, но я не мог избавиться pdf-документа. Чтобы использовать методы «createImage ...», кажется, что вам нужно создать pdf-файл, который не был для меня вариантом ... (или, возможно, я не прорывался достаточно глубоко) – Leonidas

124

Вы можете использовать библиотеку zxing для простого создания штрих-кода.

Сначала найдите core.jar под папкой libs.

libs/core.jar 

Здесь вы можете скачать ZXing-2.1.zip.

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

После разархивирования файла, найти файл фляги.

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

А затем создайте свой собственный код, как показано ниже.

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; 
    } 

} 
+0

+1 Я ценю, хорошая работа. –

+0

превосходный THX .. !! – fingerup

+0

superbbbbbb ..... точно такой же, что требуется! – Sandeep

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(); 
} 

}

+0

Я не вижу нового QRCodeEncoder (qrData, null, Contents.Type.TEXT, BarcodeFormat.EAN_13.toString(), qrCodeDimention); конструктор в версии ZXing 2.3.0. Какую версию вы используете? – tch

+0

Привет, Tomasz, я добавил код QRCodeEncoder (qrData, null, Contents.Type.TEXT, BarcodeFormat.EAN_13.toString(), qrCodeDimention); , пожалуйста, проверьте и дайте мне знать, если вы столкнетесь с любым вопросом с этим. –

Смежные вопросы