Embed Zxing library without using Barcode Scanner app [duplicate]
What is the preferred way to embed the zxing library to provide scanning without having the Barcode Scanner app installed? I am looking to embed it in android without having to prompt the user for any extra installs. (Similar to the way the iPhone src works).
It's really easier to just integrate via Intent. More reliable, and you get updates automatically. While I don't advise it...
The complete source code is available from the ZXing project. You want to build core.jar
from core/
and put it in your Android lib/
folder to include the core decoder in your app. You do not want to include javase
. You can look to the code in android/
as it is the source to Barcode Scanner, but as the authors we'd suggest you not just copy and paste it.
It is Apache licensed which means you can use it freely, as long as you essentially give the user access to the license terms.
Android QR/Barcode/Multiformat Decoder.
I have made an Android application using the ZXing APIs and embedded only the decoding code into my application. The input to this decoder was given through the SD card of the Android emulator.
Here are the steps:
First, I created an AVD(emulator) version 4 in my Eclipse IDE with the SDcard and Camera features turned ON.
-
Next, I have created an SDCard using the commands below in the command prompt:
c:\>mksdcard 40M mysdcard.iso
where 40M is the size of the SD card that i have created..This will be saved in the C: drive. Note, the .iso part is important.
-
Next, we have to mount the SD card into the emulator using the commands below in the command prompt:
c:\>emulator -sdcard "c:\mysdcard.iso" @myavd4
Here myavd4 is the name of the emulator/android virtual device that I created in step 1. The '@' sign before the avd name is important too.
Keep the emulator running all the time..If it gets closed, we have to redo the above 3 steps.
-
We can push the QR code or other code images that we have to this SD card mounted on our emulator by using the commands below in the command prompt:
c:\>adb push "c:\myqrcode.png" /sdcard
-
Next, in the Eclipse IDE, start a new android project. The code below should be pasted in the QRDecoder.java file of our project.
package com.example.palani; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.ChecksumException; import com.google.zxing.FormatException; import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; import com.google.zxing.NotFoundException; import com.google.zxing.Reader; import com.google.zxing.Result; import com.google.zxing.ResultPoint; import com.google.zxing.client.androidtest.RGBLuminanceSource; import com.google.zxing.common.HybridBinarizer; public class QRDecoder extends Activity implements OnClickListener { public static class Global { public static String text=null; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Bitmap bMap = BitmapFactory.decodeFile("/sdcard/myqrcode.png"); TextView textv = (TextView) findViewById(R.id.mytext); View webbutton=findViewById(R.id.webbutton); LuminanceSource source = new RGBLuminanceSource(bMap); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Reader reader = new MultiFormatReader(); try { Result result = reader.decode(bitmap); Global.text = result.getText(); byte[] rawBytes = result.getRawBytes(); BarcodeFormat format = result.getBarcodeFormat(); ResultPoint[] points = result.getResultPoints(); textv.setText(Global.text); webbutton.setOnClickListener(this); } catch (NotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ChecksumException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onClick(View v) { Uri uri = Uri.parse(Global.text); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } }
-
Next I downloaded the ZXing Source Code (ZXing-1.6.zip) from the below link.
http://code.google.com/p/zxing/downloads/list
Then, extract this and navigate to D:\zxing-1.6\core\src\com
copy the com folder and paste it in our package in Eclipse.
(Note, right click on the package of our project and paste...if it asks for replacing the existing folder, select yes)
-
Next, copy and paste the below code in the res/layout/main.xml file
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="20dip" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="@color/mbackground1" android:gravity="center_horizontal" android:text="@string/decode_label" android:padding="20dip" /> <TextView android:id="@+id/mytext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:background="@color/mbackground2" android:textColor="@color/mytextcolor" android:padding="20dip" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/continue_label" android:gravity="center_horizontal" android:textColor="@color/mytextcolor" android:padding="20dip" /> <Button android:id="@+id/webbutton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/web_button" android:textColor="@color/mytextcolor" /> </LinearLayout>
-
Next, copy and paste the below code in the res/values/strings.xml file
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, QRDecoder!</string> <string name="app_name">QRDecoder</string> <string name="continue_label">Click below to load the URL!!</string> <string name="web_button">Load the URL!!</string> <string name="decode_label">Decoded URL</string> </resources>
-
Next, copy and paste the below code in the res/values/color.xml file, if it does not exist, create one.
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="mbackground1">#7cfc00</color> <color name="mbackground2">#ffff00</color> <color name="mytextcolor">#d2691e</color> </resources>
-
Next, copy and paste the below code in the manifest file after the opening tag
<manifest> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
So, these above steps done...our application is ready. Now, u can run the application and it will give u the decoded result of the input image we have given.
-
In order to change the input, push another file to SD card using the command below in the command prompt
c:\>adb push "c:\image2.png" /sdcard
and change the input in our QRDecoder.java to reflect the same
Bitmap bMap = BitmapFactory.decodeFile("/sdcard/image.png");
the inputs can be any format like QRCode, Barcode, etc....the types of image can be bmp, jpg or png.
I used the below website for generating the QR codes for test purpose
http://barcode.tec-it.com/
AND http://qrcode.kaywa.com
Thanks and I would like to mention the point that I am just a beginner in android and mobile application development and sorry for any mistakes that I might have done...
If are following Palani answer and only want to import zxing core. Here is how you can use RGBLuminanceSource without importing zxing.androidtest.
// import com.google.zxing.client.androidtest.RGBLuminanceSource;
import com.google.zxing.RGBLuminanceSource;
// Bitmap mBitmap; // some bitmap...
int width = mBitmap.getWidth();
int height = mBitmap.getHeight();
int[] pixels = new int[width * height];
mBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
Result result = zxingReader.decode(binaryBitmap);
} catch (Exception e) {
e.printStackTrace();
}
Now you can use the official Barcode API from Google:
The Barcode API detects barcodes in real-time, on device, in any orientation. It can also detect multiple barcodes at once.
It reads the following barcode formats:
- 1D barcodes: EAN-13, EAN-8, UPC-A, UPC-E, Code-39, Code-93, Code-128, ITF, Codabar
- 2D barcodes: QR Code, Data Matrix, PDF-417, AZTEC
It automatically parses QR Codes, Data Matrix, PDF-417, and Aztec values, for the following supported formats:
- URL
- Contact information (VCARD, etc.)
- Calendar event
- Phone
- SMS
- ISBN
- WiFi
- Geo-location (latitude and longitude)
- AAMVA driver license/ID
I myself tried this method an most of all seemed to work.
Though I have a few points to make
It will complain about the package com.google.zxing.client.androidtest which is needed for the RGBLuminanceSource class found in the package and used in the QRDecoder Activity.So import the zxing/androidtest package as well.
If you are adding the Zxing Library outside your package then you will need to edit all the R.java references as it wont find the R.java file in its package.
For Example:
Instead of
mRunBenchmarkButton = (Button) findViewById(R.id.benchmark_run);
in the BenchmarkActivity.java file use
mRunBenchmarkButton = (Button) findViewById(yourpackage.R.id.benchmark_run);
We can also use the DDMS interface of Eclipse to push the QRCode to the device SDCard.
Using DDMS