Friday, August 19, 2016

Creating barcode image from text and scan barcoe/qrcode in android

How to create bar code image from text and scan code in android ?

To create this app we use the zxing library of QRcode scanning.
put the following line in gradle dependency in android studio.

dependencies {
    compile 'com.journeyapps:zxing-android-embedded:3.0.2@aar'    compile 'com.google.zxing:core:3.2.0'
}
Then sync your project. In your activity oncreate() create an EditText to take input and a 
button for generate barcode image and an Imageview for displaying barcode.
 
@Override
    protected void onCreate(Bundle savedInstanceState) {
        btnCreateBarcode = (Button) findViewById(R.id.btnCreateBarcode);
        btnQrCoderScanner = (Button) findViewById(R.id.btnQrCoderScanner);
        imageView = (ImageView) findViewById(R.id.imageView);
        tv = (TextView) findViewById(R.id.textView);
        input = (EditText) findViewById(R.id.input);

        btnCreateBarcode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                barcode_data = input.getText().toString();
                Bitmap bitmap = null;
                try {
                    bitmap = encodeAsBitmap(barcode_data, BarcodeFormat.CODE_128, 300, 150);
                    imageView.setImageBitmap(bitmap);

                } catch (WriterException e) {
                    e.printStackTrace();
                }
                tv.setText(barcode_data);
            }
        });

    } 
 
    private static final int WHITE = 0xFFFFFFFF;
    private static final int BLACK = 0xFF000000;

    Bitmap encodeAsBitmap(String contents, BarcodeFormat format, int img_width, int img_height) 
throws WriterException {
        String contentsToEncode = contents;
        if (contentsToEncode == null) {
            return null;
        }
        Map<EncodeHintType, Object> hints = null;
        String encoding = guessAppropriateEncoding(contentsToEncode);
        if (encoding != null) {
            hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
            hints.put(EncodeHintType.CHARACTER_SET, encoding);
        }
        MultiFormatWriter writer = new MultiFormatWriter();
        BitMatrix result;
        try {
            result = writer.encode(contentsToEncode, format, img_width, img_height, hints);
        } catch (IllegalArgumentException iae) {
            return null;
        }
        int width = result.getWidth();
        int height = result.getHeight();
        int[] pixels = new int[width * height];
        for (int y = 0; y < height; y++) {
            int offset = y * width;
            for (int x = 0; x < width; x++) {
                pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
            }
        }

        Bitmap bitmap = Bitmap.createBitmap(width, height,
                Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;
    }

    private static String guessAppropriateEncoding(CharSequence contents) {
        for (int i = 0; i < contents.length(); i++) {
            if (contents.charAt(i) > 0xFF) {
                return "UTF-8";
            }
        }
        return null;
    }

If you want to scan barcode or qrcode then just add another button and add action to it like -
        btnQrCoderScanner.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
                integrator.initiateScan();
            }
        });  
The IntentIntegrator will give a result back So on onActivityResult() catch the scan result .
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (scanResult != null) {
            Toast.makeText(this, scanResult.getContents(), Toast.LENGTH_SHORT).show();
        }
     
    }

Thursday, August 18, 2016

Centering drawable-left image in android Button in XML

Centering drawable-left image in android Button in XML

To center a button drawable left need adjust the padding of button and its drawable left padding.
Giving the Button a fixed width we can do this.

 

  1. <Button
  2. android:layout_below="@+id/imgSave"
  3. android:id="@+id/btninvSearch"
  4. android:layout_width="170dp"
  5. android:layout_height="wrap_content"
  6. android:drawableLeft="@drawable/ic_action_camera"
  7. android:drawablePadding="0dp"
  8. android:paddingLeft="40dp"
  9. android:paddingRight="0dp"
  10. android:paddingTop="12dp"
  11. android:paddingBottom="12dp"
  12. android:gravity="center"

See detail here