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