Last Updated on 12 years by Mas Herdi
Untuk tutorial membuat QR Code Scanner yang lebih mudah, klik link ini.
Pada kali ini, karena request dari teman, saya akan membuat sebuah QRCode reader sederhana di Android, Sebelumnya saya pernah membuat aplikasi seperti ini yang digunakan untuk presensi/absensi kehadiran. Namun lebih kompleks karena aplikasi tersebut harus tersambung ke internet. Kali ini kita buat versi sederhananya saja.
QRCode Library
Oke, pertama-tama kita butuh library. Karena di sini kita nggak coding dari awal… hehe Lagipula kalau ada orang lain yang sudah buat, kenapa kita nggak menggunakan buatan mereka :p
Library yang dibutuhkan adalah ZXing barcode image library. Cara menggunakannya, kita pertama-tama harus menginstall BarcodeScanner.apk terlebih dahulu ke emulator/ponsel Android kita. Versi yang digunakan di sini adalah versi 3.4, bisa didownload di sini.
Cara penginstalan :
- untuk ponsel Android, copy-kan APK-nya ke SDCard. Dan kemudian install dari sana.
- untuk emulator Android, gunakan cara sebagai berikut.
Saya sarankan untuk menggunakan ponsel Android asli dalam tutorial ini, karena terkadang emulator Android tidak mendukung jenis-jenis webcam tertentu.
Warming Up
Sekarang, kita akan mulai membuat aplikasinya. Buatlah sebuah project Android di Eclipse dengan nama package id.web.twoh.QRProject (opsional). Bagi yang belum tahu, tutorialnya bisa dibaca di sini. Setelah itu buatlah sebuah package baru untuk library ZXing yang akan kita pakai, dipisahkan dengan package lama. Susunannya seperti ini :
Oke, packagenya bernama com.example.BarcodeTest. Dan di dalamnya ada dua buah kelas, yaitu IntentIntegrator.java dan IntentResult.java. IntentIntegrator berfungsi untuk mengintegrasikan aplikasi ini dengan aplikasi Barcode Scanner yang baru kita install. Sedangkan IntentResult.java berfungsi untuk mengembalikan data hasil scan dari Barcode Scanner ke aplikasi kita, sehingga nanti datanya bisa kita oleh.
Kode untuk kedua kelas tersebut sudah dispesifikasikan oleh pembuatnya, yaitu sebagai berikut :
Kode untuk IntentIntegrator.java (Apache License):
package com.example.BarcodeTest; /* * Copyright 2009 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import android.app.AlertDialog; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; /** * <p>A utility class which helps ease integration with Barcode Scanner via {@link Intent}s. This is a * simple * way to invoke barcode scanning and receive the result, without any need to integrate, modify, or learn * the * project's source code.</p> * * <h2>Initiating a barcode scan</h2> * * <p>Integration is essentially as easy as calling {@link #initiateScan(Activity)} and waiting * for the result in your app.</p> * * <p>It does require that the Barcode Scanner application is installed. The * {@link #initiateScan(Activity)} method will prompt the user to download the application, if needed.</p> * * <p>There are a few steps to using this integration. First, your {@link Activity} must implement * the method {@link Activity#onActivityResult(int, int, Intent)} and include a line of code like this:</p> * * <p>{@code * public void onActivityResult(int requestCode, int resultCode, Intent intent) { * IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); * if (scanResult != null) { * // handle scan result * } * // else continue with any other code you need in the method * ... * } * }</p> * * <p>This is where you will handle a scan result. * Second, just call this in response to a user action somewhere to begin the scan process:</p> * * <p>{@code IntentIntegrator.initiateScan(yourActivity);}</p> * * <p>You can use {@link #initiateScan(Activity, CharSequence, CharSequence, CharSequence, CharSequence)} * or * {@link #initiateScan(Activity, int, int, int, int)} to customize the download prompt with * different text labels.</p> * * <p>Note that {@link #initiateScan(Activity)} returns an {@link AlertDialog} which is non-null if the * user was prompted to download the application. This lets the calling app potentially manage the dialog. * In particular, ideally, the app dismisses the dialog if it's still active in its {@link * Activity#onPause()} * method.</p> * * <h2>Sharing text via barcode</h2> * * <p>To share text, encoded as a QR Code on-screen, similarly, see {@link #shareText(Activity, * CharSequence)}.</p> * * <p>Some code, particularly download integration, was contributed from the Anobiit application.</p> * * @author Sean Owen * @author Fred Lin * @author Isaac Potoczny-Jones * @author Brad Drehmer */ public final class IntentIntegrator { public static final int REQUEST_CODE = 0x0ba7c0de; // get it? public static final String DEFAULT_TITLE = "Install Barcode Scanner?"; public static final String DEFAULT_MESSAGE = "This application requires Barcode Scanner. Would you like to install it?"; public static final String DEFAULT_YES = "Yes"; public static final String DEFAULT_NO = "No"; // supported barcode formats public static final String PRODUCT_CODE_TYPES = "UPC_A,UPC_E,EAN_8,EAN_13"; public static final String ONE_D_CODE_TYPES = PRODUCT_CODE_TYPES + ",CODE_39,CODE_93,CODE_128"; public static final String QR_CODE_TYPES = "QR_CODE"; public static final String ALL_CODE_TYPES = null; private IntentIntegrator() { } /** * See {@link #initiateScan(Activity, CharSequence, CharSequence, CharSequence, CharSequence)} -- * same, but uses default English labels. */ public static AlertDialog initiateScan(Activity activity) { return initiateScan(activity, DEFAULT_TITLE, DEFAULT_MESSAGE, DEFAULT_YES, DEFAULT_NO); } /** * See {@link #initiateScan(Activity, CharSequence, CharSequence, CharSequence, CharSequence)} -- * same, but takes string IDs which refer * to the {@link Activity}'s resource bundle entries. */ public static AlertDialog initiateScan(Activity activity, int stringTitle, int stringMessage, int stringButtonYes, int stringButtonNo) { return initiateScan(activity, activity.getString(stringTitle), activity.getString(stringMessage), activity.getString(stringButtonYes), activity.getString(stringButtonNo)); } /** * See {@link #initiateScan(Activity, CharSequence, CharSequence, CharSequence, CharSequence, CharSequence)} -- * same, but scans for all supported barcode types. * @param stringTitle title of dialog prompting user to download Barcode Scanner * @param stringMessage text of dialog prompting user to download Barcode Scanner * @param stringButtonYes text of button user clicks when agreeing to download * Barcode Scanner (e.g. "Yes") * @param stringButtonNo text of button user clicks when declining to download * Barcode Scanner (e.g. "No") * @return an {@link AlertDialog} if the user was prompted to download the app, * null otherwise */ public static AlertDialog initiateScan(Activity activity, CharSequence stringTitle, CharSequence stringMessage, CharSequence stringButtonYes, CharSequence stringButtonNo) { return initiateScan(activity, stringTitle, stringMessage, stringButtonYes, stringButtonNo, ALL_CODE_TYPES); } /** * Invokes scanning. * * @param stringTitle title of dialog prompting user to download Barcode Scanner * @param stringMessage text of dialog prompting user to download Barcode Scanner * @param stringButtonYes text of button user clicks when agreeing to download * Barcode Scanner (e.g. "Yes") * @param stringButtonNo text of button user clicks when declining to download * Barcode Scanner (e.g. "No") * @param stringDesiredBarcodeFormats a comma separated list of codes you would * like to scan for. * @return an {@link AlertDialog} if the user was prompted to download the app, * null otherwise * @throws InterruptedException if timeout expires before a scan completes */ public static AlertDialog initiateScan(Activity activity, CharSequence stringTitle, CharSequence stringMessage, CharSequence stringButtonYes, CharSequence stringButtonNo, CharSequence stringDesiredBarcodeFormats) { Intent intentScan = new Intent("com.google.zxing.client.android.SCAN"); intentScan.addCategory(Intent.CATEGORY_DEFAULT); // check which types of codes to scan for if (stringDesiredBarcodeFormats != null) { // set the desired barcode types intentScan.putExtra("SCAN_FORMATS", stringDesiredBarcodeFormats); } try { activity.startActivityForResult(intentScan, REQUEST_CODE); return null; } catch (ActivityNotFoundException e) { return showDownloadDialog(activity, stringTitle, stringMessage, stringButtonYes, stringButtonNo); } } private static AlertDialog showDownloadDialog(final Activity activity, CharSequence stringTitle, CharSequence stringMessage, CharSequence stringButtonYes, CharSequence stringButtonNo) { AlertDialog.Builder downloadDialog = new AlertDialog.Builder(activity); downloadDialog.setTitle(stringTitle); downloadDialog.setMessage(stringMessage); downloadDialog.setPositiveButton(stringButtonYes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) { Uri uri = Uri.parse("market://search?q=pname:com.google.zxing.client.android"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); activity.startActivity(intent); } }); downloadDialog.setNegativeButton(stringButtonNo, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) {} }); return downloadDialog.show(); } /** * <p>Call this from your {@link Activity}'s * {@link Activity#onActivityResult(int, int, Intent)} method.</p> * * @return null if the event handled here was not related to {@link IntentIntegrator}, or * else an {@link IntentResult} containing the result of the scan. If the user cancelled scanning, * the fields will be null. */ public static IntentResult parseActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { String contents = intent.getStringExtra("SCAN_RESULT"); String formatName = intent.getStringExtra("SCAN_RESULT_FORMAT"); return new IntentResult(contents, formatName); } else { return new IntentResult(null, null); } } return null; } /** * See {@link #shareText(Activity, CharSequence, CharSequence, CharSequence, CharSequence, CharSequence)} -- * same, but uses default English labels. */ public static void shareText(Activity activity, CharSequence text) { shareText(activity, text, DEFAULT_TITLE, DEFAULT_MESSAGE, DEFAULT_YES, DEFAULT_NO); } /** * See {@link #shareText(Activity, CharSequence, CharSequence, CharSequence, CharSequence, CharSequence)} -- * same, but takes string IDs which refer to the {@link Activity}'s resource bundle entries. */ public static void shareText(Activity activity, CharSequence text, int stringTitle, int stringMessage, int stringButtonYes, int stringButtonNo) { shareText(activity, text, activity.getString(stringTitle), activity.getString(stringMessage), activity.getString(stringButtonYes), activity.getString(stringButtonNo)); } /** * Shares the given text by encoding it as a barcode, such that another user can * scan the text off the screen of the device. * * @param text the text string to encode as a barcode * @param stringTitle title of dialog prompting user to download Barcode Scanner * @param stringMessage text of dialog prompting user to download Barcode Scanner * @param stringButtonYes text of button user clicks when agreeing to download * Barcode Scanner (e.g. "Yes") * @param stringButtonNo text of button user clicks when declining to download * Barcode Scanner (e.g. "No") */ public static void shareText(Activity activity, CharSequence text, CharSequence stringTitle, CharSequence stringMessage, CharSequence stringButtonYes, CharSequence stringButtonNo) { Intent intent = new Intent(); intent.setAction("com.google.zxing.client.android.ENCODE"); intent.putExtra("ENCODE_TYPE", "TEXT_TYPE"); intent.putExtra("ENCODE_DATA", text); try { activity.startActivity(intent); } catch (ActivityNotFoundException e) { showDownloadDialog(activity, stringTitle, stringMessage, stringButtonYes, stringButtonNo); } } }
Sedangkan kode untuk IntentResult.java (Apache License):
package com.example.BarcodeTest; /* * Copyright 2009 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * <p>Encapsulates the result of a barcode scan invoked through {@link IntentIntegrator}.</p> * * @author Sean Owen */ public final class IntentResult { private final String contents; private final String formatName; IntentResult(String contents, String formatName) { this.contents = contents; this.formatName = formatName; } /** * @return raw content of barcode */ public String getContents() { return contents; } /** * @return name of format, like "QR_CODE", "UPC_A". See <code>BarcodeFormat</code> for more format names. */ public String getFormatName() { return formatName; } }
Dua kelas di atas bisa didownload di situs Google Project ZXing.
Oke, sekarang kita sudah selesai menyiapkan library ZXing yang akan kita pakai. Selanjutnya, kita akan membuat aplikasi QRCode Scanner yang sebenarnya. Berhubung ini sudah malam, saya lanjutkan besok ya 😀
Semoga berguna.
Salam agan, bagaimana caranya membuat qr code reader yang sebenarnya tanpa menginstal BarcodeScanner.apk, ?? mohon lampunya gan,. 🙂
Belum cari tau ane gan 😀
Tapi pasti ada caranya
Amazing tutorial, keep posting master
ada yang bisa bantu
ko ini error y
dibagian intenintegrator.java
}
return new IntentResult();
}
return null;
}
kalo misalnya menggunakan 2 button scan itu mangginya gimna?
ini codenya :
//SCANKODE
public void scannim(){
//instantiate ZXing integration class
IntentIntegrator scanIntegrator = new IntentIntegrator(this);
//mulai scan Nim
scanIntegrator.initiateScan();
}
public void scanbuku(){
//instantiate ZXing integration class
IntentIntegrator1 scanBuku = new IntentIntegrator1(this);
//mulai scan Buku
scanBuku.scanKodeBuku();
}
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
//retrieve result of scanning – instantiate ZXing object
IntentResult scanningResult1 = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
//check we have a valid result
if (scanningResult1 != null) {
//MENGAMBIL NIM from Intent Result
String scanContent = scanningResult1.getContents();
nim.setText(scanContent);
}
else{
//invalid scan data or scan canceled
Toast toast = Toast.makeText(getApplicationContext(),
“No scan data received!”, Toast.LENGTH_SHORT);
toast.show();
}
}
protected void onActivityResult1(int mintakode, int hasilkode, Intent intent) {
//retrieve result of scanning – instantiate ZXing object
IntentResult1 scanningResult1 = IntentIntegrator1.parseActivityResult1(mintakode, hasilkode, intent);
//check we have a valid result
if (scanningResult1 != null) {
//MENGAMBIL NIM from Intent Result
String HasilScan = scanningResult1.getKodeBuku();
kd_buku.setText(HasilScan);
}
else{
//invalid scan data or scan canceled
Toast toast = Toast.makeText(getApplicationContext(),
“No scan data received!”, Toast.LENGTH_SHORT);
toast.show();
}
}
bang kan saya udah ngikutin tahapan’a semua tapi pas app nya mau d buka langsung close sendiri .. itu apa’a yang salah y ???
BarcodeScanner.apk dapat download darimana ya gan? kalo link yang diberikan itukan masuk ke GitHub dan berisi source project. apakah project ini didownload dulu lalu dibuat apk atau gimana? tolong pencerahannya gan. Thanks
Mas, maaf mau tanya. Ini BarcodeScanner.apk nya ada di mana ya? Saya sudah download di link yang mas kasih yang masuk ke Github dan yang saya buka hanya berisi source code saja. Tidak ketemu .apk nya ada di mana. Terima kasih mas.
Ini sudah lama tidak saya update, nanti tunggu saya update ya