Hello friends,
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:
1. First, I created an AVD(emulator) version 4 in my Eclipse IDE with
the SDcard and Camera features turned ON.
2. 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.
3. 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.
4. 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
5. 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);
}
}
6. 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 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)
7. 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>
8. 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>
9. 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>
10. 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" />
11. 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.
12. 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/
http://qrcode.kaywa.com/
Now for embedding the Zxing Decoder and the Scanner, these are the
necessary imports to be used in our app
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;
and after scanning the image through the camera, the input to the
decoder is given as below
LuminanceSource source = new RGBLuminanceSource(bMap);
/*bMap is the bitmap input from the camera */
BinaryBitmap bitmap = new BinaryBitmap(new
HybridBinarizer(source));
Reader reader = new MultiFormatReader();
try {
Result result = reader.decode(bitmap);
myresult = result.getText();
//byte[] rawBytes = result.getRawBytes();
//BarcodeFormat format = result.getBarcodeFormat();
//ResultPoint[] points = result.getResultPoints();
/*The above three byte[], BarcodeFormat, ResultPoint are the other
outputs of the Decoder that can be used as necessary*/
}
catch (NotFoundException e) {
e.printStackTrace();
} catch (ChecksumException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}
}
I have not included Camera Scanner as I was working in Android
Emulator.
If that is needed, you can include CameraTestActivity.java and other
files that are available in the androidtest\ folder.
zxing-1.6\androidtest\src\com\google\zxing\client\androidtest
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...