Tuesday, 13 December 2016

Scan barcode from an image in gallery android form Fragment

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