Monday, 12 January 2015

How to Encode Decode QR Code Android

Hey friends here you will see how to encode and decode QR Code in android application. First of all go through final output do you really want this QR Reader if yes then you are on the right place.

Requirements
1) Eclipse IDE (any version)
2) Android SDK
3)ZxingLibrary

1) Pick image from sd card and Decode encrypted code:

package my.qrcode;

import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ImageButton;
import android.widget.RelativeLayout;

import com.dlazaro66.qrcodereaderview.RGBLuminanceSource;//Download saperately this package if you did't find inside ZXing library
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;

public class DecodeActivity extends Activity implements OnClickListener {

private ImageButton captureIB;
private ImageButton galleryIB;
private String selectedImagePath;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_decode);
captureIB = (ImageButton) findViewById(R.id.captureIB);
galleryIB = (ImageButton) findViewById(R.id.galleryIB);
adsRL = (RelativeLayout) findViewById(R.id.adsRL);
loadAds(adsRL);

captureIB.setOnClickListener(this);
galleryIB.setOnClickListener(this);

}

@Override
public void onClick(View v) {
int id = v.getId();

switch (id) {
case R.id.captureIB:
startActivity(new Intent(getApplicationContext(),
DecoderActivity.class));
break;
case R.id.galleryIB:
choosePicture();
break;

default:
break;
}

}

public void choosePicture() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select QR image"),
SELECT_PICTURE);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_OK) {
if (requestCode == SELECT_PICTURE) {
Uri selectedImageUri = data.getData();
if (Build.VERSION.SDK_INT < 19) {
selectedImagePath = getPath(selectedImageUri);
loge("My image path" + selectedImagePath);
Bitmap bitmap = BitmapFactory.decodeFile(selectedImagePath);

//Convert selected image to bitmap. because QR code require bitmap for decryption
decodeImage(bitmap);
}

}
}
}

public String getPath(Uri uri) {
if (uri == null) {
return null;
}
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(uri, projection, null, null,
null);
if (cursor != null) {
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
return uri.getPath();
}

public String decodeImage(Bitmap bmp) {

QRCodeReader reader = new QRCodeReader();
try {
LuminanceSource source = new RGBLuminanceSource(bmp);// Find with in import package
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result = reader.decode(bitmap);
String text = result.getText();
loge("QR code response==>" + text);
toast("Scanned code:=>>>> " + text);

} catch (NotFoundException e) {
e.printStackTrace();
} catch (ChecksumException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}

return null;
}

}




2) Encode text into QR image

package my.qrcode;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Random;

import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

public class EncodeActivity extends Activity implements OnClickListener {

private Button encodeBT;
private Button shareBT;
private EditText dataET;
private ImageView qrimageIV;
private String fname;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_encode);
encodeBT = (Button) findViewById(R.id.encodeBT);
shareBT = (Button) findViewById(R.id.shareBT);
dataET = (EditText) findViewById(R.id.dataET);
adsRL = (RelativeLayout) findViewById(R.id.adsRL);

qrimageIV = (ImageView) findViewById(R.id.qrimageIV);
encodeBT.setOnClickListener(this);
shareBT.setOnClickListener(this);
}

@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.encodeBT:
String data = dataET.getText().toString().trim();
if (data.length() <= 0)
toast("Please enter text to encode");
else
encode(data);
break;
case R.id.shareBT:
if (fname != null)
share(fname);
break;

default:
break;
}

}

public void encode(String data) {

QRCodeWriter qrCodeEncoder = new QRCodeWriter();// to write qr code image

BitMatrix max = null;
try {
max = qrCodeEncoder.encode(data, BarcodeFormat.QR_CODE, 100, 100);// You may select any code format here
} catch (WriterException e) {

e.printStackTrace();
}
saveQRImage(max);
}

public void saveQRImage(BitMatrix max) {
Bitmap qrBmp = toBitmap(max);
qrimageIV.setImageBitmap(qrBmp);
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/QRcodes");
myDir.mkdirs();
Random generator = new Random();
int n = 10000;
n = generator.nextInt(n);
fname = "code-" + n + ".jpg";
File file = new File(myDir, fname);
if (file.exists())
file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
qrBmp.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();

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

}

public static Bitmap toBitmap(BitMatrix matrix) {// set qr image height width.
int height = matrix.getHeight();
int width = matrix.getWidth();
Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
bmp.setPixel(x, y, matrix.get(x, y) ? Color.BLACK : Color.WHITE);

}
}

return bmp;
}
}

Let me know your email id if you need full source code Link to review functionality.