I have a working sample on how to implement this
/**
* Created by shashi kumar on 12/14/2016.
*/
public class Main2Activity extends Fragment {
private ImageView barcodeImageView;
private Button pickBarcodeButton;
private TextView barcodeResultTextView;
Context ctx;
private String result = "";
protected static final int PICK_IMAGE_REQUEST = 100;
/* @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initializeViews();
}*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ctx = this.getContext();
View rootView = inflater.inflate(R.layout.activity_main2, container, false);
barcodeImageView = (ImageView) rootView.findViewById(R.id.barcode_image);
pickBarcodeButton = (Button) rootView.findViewById(R.id.pick_barcode_btn);
// barcodeResultTextView = (TextView) rootView.findViewById(R.id.barcode_result_txtview);
// showBackButton();
((AppMain) getActivity()).getSupportActionBar().setTitle("Help");
initializeViews();
return rootView;
}
private void initializeViews() {
/* barcodeImageView = (ImageView) rootView.findViewById(R.id.barcode_image);
pickBarcodeButton = (Button) findViewById(R.id.pick_barcode_btn);
barcodeResultTextView = (TextView) findViewById(R.id.barcode_result_txtview);*/
pickBarcodeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/* Intent intent = new Intent();
intent.setType("image*//*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);*/
Intent photoPic = new Intent(Intent.ACTION_PICK);
photoPic.setType("image/*");
startActivityForResult(photoPic, PICK_IMAGE_REQUEST);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == PICK_IMAGE_REQUEST){
if (resultCode == RESULT_OK) {
if (data != null && data.getData() != null) {
Uri uri = data.getData();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(ctx.getContentResolver(), uri);
new ScanTask(bitmap).execute();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
/**
* @author dipenp
* AsyncTask to scan barcode in background.
*/
class ScanTask extends AsyncTask<String, String, String> {
private Bitmap bitmap;
public ScanTask(Bitmap bitmap) {
this.bitmap = bitmap;
}
@Override
protected String doInBackground(String... params) {
try {
Result[] results = decode(bitmap);
if (null != results) {
for (int i = 0; i < results.length; i++) {
result = result +" ("+(i+1)+") "+ results[i].getText() + "\n";
}
} else {
result = "No result found:::";
}
} catch (Exception e) {
result = "Exception";
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String res) {
// barcodeResultTextView.setText(result);
DialogShow();
super.onPostExecute(res);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
barcodeImageView.setImageBitmap(bitmap);
}
}
/**
* @param imageBitmap : Bitmap image
* @return Array of barcode result
*/
public Result[] decode(Bitmap imageBitmap) {
MultiFormatReader reader = null;
Map<DecodeHintType, Object> hints = new EnumMap<DecodeHintType, Object>(DecodeHintType.class);
/* There are different format to create barcode and qrcode,
* while extracting we are adding all the possible format for better result.
*/
hints.put(DecodeHintType.POSSIBLE_FORMATS, EnumSet.allOf(BarcodeFormat.class));
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
reader = new MultiFormatReader();
reader.setHints(hints);
int width = imageBitmap.getWidth();
int height = imageBitmap.getHeight();
int[] pixels = new int[width * height];
imageBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
MultipleBarcodeReader multiReader = new GenericMultipleBarcodeReader(reader);
Result[] theResults = null;
try {
/* decode multiple is used so that if multiple barcode is present in single image we can get result for all of them.
*/
theResults = multiReader.decodeMultiple(bitmap, hints);
} catch (NotFoundException e1) {
e1.printStackTrace();
}
return theResults;
}
protected void DialogShow() {
android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(ctx);
builder.setTitle("Confirmation?");
//builder.setIcon( R.drawable.ic_local_offer_black_24dp );
builder.setCancelable(false);
builder.setMessage(result);
builder.setNegativeButton("Share", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
final Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, result);
getContext().startActivity(Intent.createChooser(shareIntent, "Share text"));
}
});
builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
}
});
// create an alert dialog
android.app.AlertDialog alert = builder.create();
alert.show();
}
}
No comments:
Post a Comment