How to read barcodes with the camera on Android? How to read barcodes with the camera on Android? android android

How to read barcodes with the camera on Android?


It's not built into the SDK, but you can use the Zxing library. It's free, open source, and Apache-licensed.

The 2016 recommendation is to use the Barcode API, which also works offline.


2016 update

With the latest release of Google Play Services, v7.8, you have access to the new Mobile Vision API. That's probably the most convenient way to implement barcode scanning now, and it also works offline.

From the Android Barcode API:

The Barcode API detects barcodes in real-time, on device, in any orientation. It can also detect multiple barcodes at once.

It reads the following barcode formats:

  • 1D barcodes: EAN-13, EAN-8, UPC-A, UPC-E, Code-39, Code-93, Code-128, ITF, Codabar
  • 2D barcodes: QR Code, Data Matrix, PDF-417, AZTEC

It automatically parses QR Codes, Data Matrix, PDF-417, and Aztec values, for the following supported formats:

  • URL
  • Contact information (VCARD, etc.)
  • Calendar event
  • Email
  • Phone
  • SMS
  • ISBN
  • WiFi
  • Geo-location (latitude and longitude)
  • AAMVA driver license/ID


Here is sample code using camera api

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.util.SparseArray;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.widget.Button;import android.widget.TextView;import java.io.IOException;import com.google.android.gms.vision.CameraSource;import com.google.android.gms.vision.Detector;import com.google.android.gms.vision.Frame;import com.google.android.gms.vision.barcode.Barcode;import com.google.android.gms.vision.barcode.BarcodeDetector;public class MainActivity extends AppCompatActivity {TextView barcodeInfo;SurfaceView cameraView;CameraSource cameraSource;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    cameraView = (SurfaceView) findViewById(R.id.camera_view);      barcodeInfo = (TextView) findViewById(R.id.txtContent);    BarcodeDetector barcodeDetector =            new BarcodeDetector.Builder(this)                    .setBarcodeFormats(Barcode.CODE_128)//QR_CODE)                    .build();    cameraSource = new CameraSource            .Builder(this, barcodeDetector)            .setRequestedPreviewSize(640, 480)            .build();    cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {        @Override        public void surfaceCreated(SurfaceHolder holder) {            try {                cameraSource.start(cameraView.getHolder());            } catch (IOException ie) {                Log.e("CAMERA SOURCE", ie.getMessage());            }        }        @Override        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {        }        @Override        public void surfaceDestroyed(SurfaceHolder holder) {            cameraSource.stop();        }    });    barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {        @Override        public void release() {        }        @Override        public void receiveDetections(Detector.Detections<Barcode> detections) {            final SparseArray<Barcode> barcodes = detections.getDetectedItems();            if (barcodes.size() != 0) {                barcodeInfo.post(new Runnable() {    // Use the post method of the TextView                    public void run() {                        barcodeInfo.setText(    // Update the TextView                                barcodes.valueAt(0).displayValue                        );                    }                });            }        }    });}}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.example.gateway.cameraapibarcode.MainActivity"><LinearLayout    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:orientation="vertical">    <SurfaceView        android:layout_width="640px"        android:layout_height="480px"        android:layout_centerVertical="true"        android:layout_alignParentLeft="true"        android:id="@+id/camera_view"/>    <TextView        android:text=" code reader"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:id="@+id/txtContent"/>    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Process"        android:id="@+id/button"        android:layout_alignParentTop="true"        android:layout_alignParentStart="true" />    <ImageView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:id="@+id/imgview"/></LinearLayout></RelativeLayout>

build.gradle(Module:app)

add compile 'com.google.android.gms:play-services:7.8.+' in dependencies