Kamis, 21 Mei 2015

Android Generate Barcode

Halooo …
Hari ini saya akan membagikan tutorial tentang bagaimana cara membuat barcode. Disini saya kasih contoh membuat barcode “QR”. Berikut bahan yang dibutuhkan :
  1. Library Barcode Zxing Lib Android download disini
  2. Beberapa Class Khusus
  3. Sample Code



Setelah kalian mendownload library Zxing. Silahkan buat class “Contents.java” lalu masukan kode berikut :
package com.kreativdeveloper.generatebarcode;

import android.provider.ContactsContract;

public final class Contents {
 private Contents() {
 }

 public static final class Type {

 // Plain text. Use Intent.putExtra(DATA, string). This can be used for
 // URLs too, but string
 // must include "http://" or "https://".
 public static final String TEXT = "TEXT_TYPE";

 // An email type. Use Intent.putExtra(DATA, string) where string is the
 // email address.
 public static final String EMAIL = "EMAIL_TYPE";

 // Use Intent.putExtra(DATA, string) where string is the phone number to
 // call.
 public static final String PHONE = "PHONE_TYPE";

 // An SMS type. Use Intent.putExtra(DATA, string) where string is the
 // number to SMS.
 public static final String SMS = "SMS_TYPE";

 // A contact. Send a request to encode it as follows:
 // <p/>
 // import android.provider.Contacts;
 // <p/>
 // Intent intent = new Intent(Intents.Encode.ACTION);
 // intent.putExtra(Intents.Encode.TYPE,
 // CONTACT); Bundle bundle = new Bundle();
 // bundle.putString(Contacts.Intents.Insert.NAME,
 // "Jenny"); bundle.putString(Contacts.Intents.Insert.PHONE, "8675309");
 // bundle.putString(Contacts.Intents.Insert.EMAIL, "jenny@the80s.com");
 // bundle.putString(Contacts.Intents.Insert.POSTAL,
 // "123 Fake St. San Francisco, CA 94102");
 // intent.putExtra(Intents.Encode.DATA, bundle);

 public static final String CONTACT = "CONTACT_TYPE";

 // A geographic location. Use as follows:
 // Bundle bundle = new Bundle();
 // bundle.putFloat("LAT", latitude);
 // bundle.putFloat("LONG", longitude);
 // intent.putExtra(Intents.Encode.DATA, bundle);

 public static final String LOCATION = "LOCATION_TYPE";

 private Type() {
 }
 }

 public static final String URL_KEY = "URL_KEY";

 public static final String NOTE_KEY = "NOTE_KEY";

 // When using Type.CONTACT, these arrays provide the keys for adding or
 // retrieving multiple
 // phone numbers and addresses.
 public static final String[] PHONE_KEYS = {
 ContactsContract.Intents.Insert.PHONE,
 ContactsContract.Intents.Insert.SECONDARY_PHONE,
 ContactsContract.Intents.Insert.TERTIARY_PHONE };

 public static final String[] PHONE_TYPE_KEYS = {
 ContactsContract.Intents.Insert.PHONE_TYPE,
 ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE,
 ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE };

 public static final String[] EMAIL_KEYS = {
 ContactsContract.Intents.Insert.EMAIL,
 ContactsContract.Intents.Insert.SECONDARY_EMAIL,
 ContactsContract.Intents.Insert.TERTIARY_EMAIL };

 public static final String[] EMAIL_TYPE_KEYS = {
 ContactsContract.Intents.Insert.EMAIL_TYPE,
 ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE,
 ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE };
}
Setelah itu buat juga class “QRCodeEncoder.java”. dan masukan kode berikut :
asdpackage com.kreativdeveloper.generatebarcode;

import java.util.Collection;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.telephony.PhoneNumberUtils;

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

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

 private static 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();
 }
}
Jika kedua class di atas sudah di buat dan kode telah sesuai, selanjut nya masukan kode ini di MainActivity.java :
package com.kreativdeveloper.generatebarcode;
/**
 * @author yudirahmat
 * @email yudirahmat7@gmail.com
 * @wordpress kreativdeveloper.wordpress.com
 */
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;

public class MainActivity extends Activity {
 private Button button1;
 private EditText qrInput;
 private ImageView myImage;

 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 button1 = (Button) findViewById(R.id.button1);
 qrInput = (EditText) findViewById(R.id.qrInput);
 myImage = (ImageView) findViewById(R.id.imageView1);
 
 button1.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View v) { 
 GenerateBarcode(qrInput.getText().toString()); 
 }
 });

 }
 
 private void GenerateBarcode(String qrInputText) {
 int width = 1000; //point.x;
 int height = 300; //point.y;
 int smallerDimension = width < height ? width : height;
 smallerDimension = smallerDimension * 3 / 4;

 QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(qrInputText, null,
 Contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(),
 smallerDimension);
 
 try {
 Bitmap bitmap = qrCodeEncoder.encodeAsBitmap();
 myImage.setImageBitmap(bitmap);

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


}
Sekarang untuk layoutnya masukan kode berikut di activity_main.xml :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:background="#f0f0f0"
 android:orientation="vertical" >

 <LinearLayout
 android:id="@+id/layout_header"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:background="#ffbb33"
 android:orientation="vertical" >

 <ImageView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"
 android:contentDescription="@string/app_name"
 android:src="@drawable/ic_logo" />
 </LinearLayout>

 <LinearLayout
 android:id="@+id/layout_content"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_above="@+id/textview1"
 android:layout_below="@+id/layout_header"
 android:orientation="vertical"
 android:padding="15dp" >

 <EditText
 android:id="@+id/qrInput"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:hint="Masukan Data Barcode"
 android:inputType="text"
 android:padding="10dp" />

 <Button
 android:id="@+id/button1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginTop="10dp"
 android:text="Generate Barcode" />

 <ImageView
 android:id="@+id/imageView1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginTop="10dp"
 android:contentDescription="@string/app_name" />
 </LinearLayout>

 <TextView
 android:id="@+id/textview1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_alignParentBottom="true"
 android:layout_centerHorizontal="true"
 android:background="#ffbb33"
 android:gravity="center"
 android:padding="10dp"
 android:text="Kreativdeveloper.wordpress.com"
 android:textColor="#ffffff"
 android:textSize="12sp" />

</RelativeLayout>
Untuk full source code nya kalian bisa download disini
Sekian dari tutorial nya. Semoga bermanfaat  :) :D
Jika masih ada yang bikin kalian bingung, silahkan tanya di komentar .
jangan lupa tinggalkan komentar kalian disini  :D

Tidak ada komentar:

Posting Komentar