Tutorial

QR Code Scanner - Barcode Scanner for Android

Published on August 3, 2022
author

By Anupam Chugh

QR Code Scanner - Barcode Scanner for Android

QR Code scanner or Barcode scanner for android features are present in many apps to read some useful data. In this tutorial, we’ll be discussing and implementing the Barcode API present in the Google Mobile Vision API. To know the implementation of Face Detection using the Vision API refer here.

Barcode Scanner for Android

QR Code Scanner for Android, Bar code scanner for android tutorial With the introduction of Google Vision API, implementing Barcodes in an application has got a lot easier for developers. Following are the major formats that the Vision API supports.

  • 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

Barcodes can scan things ranging from URL, Contact info to Geolocation, WIFI, Driver license IDs. QR Code is the more popular format and is commonly seen in many applications. Below, we’ll be developing an application that scans the QR Code value from a bitmap image as well as detects QR Code through a camera and perform the relevant actions.

QR Code Scanner for Android project structure

QR Code Scanner for Android, Barcode scanner for anroid

Configuring Android Studio for Barcode Library

Add the following inside the build.gradle file.

implementation 'com.google.android.gms:play-services-vision:11.8.0'

Add the following inside the AndroidManifest.xml file application tag to enable barcode detection in your application.

<meta-data
            android:name="com.google.android.gms.vision.DEPENDENCIES"
            android:value="barcode" />

QR Code Scanner from Image

The code for the activity_main.xml layout file is given below.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    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">


    <Button
        android:id="@+id/btnTakePicture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/take_barcode_picture" />

    <Button
        android:id="@+id/btnScanBarcode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btnTakePicture"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="@dimen/activity_horizontal_margin"
        android:text="@string/scan_barcode" />
</RelativeLayout>

The code for the MainActivity.java is given below.

package com.journaldev.barcodevisionapi;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button btnTakePicture, btnScanBarcode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private void initViews() {
        btnTakePicture = findViewById(R.id.btnTakePicture);
        btnScanBarcode = findViewById(R.id.btnScanBarcode);
        btnTakePicture.setOnClickListener(this);
        btnScanBarcode.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.btnTakePicture:
                startActivity(new Intent(MainActivity.this, PictureBarcodeActivity.class));
                break;
            case R.id.btnScanBarcode:
                startActivity(new Intent(MainActivity.this, ScannedBarcodeActivity.class));
                break;
        }

    }
}

The MainActivity.java contains two buttons. The first launches an Activity that scans for a QR Code in the bitmap image captured from the camera and returns the data present in the QR Code(if any). The second scans for the QRCode and detects them in real time. Before we move onto the business logic of the application, we need to add the following permissions to the AndroidManifest.xml file.

<uses-feature
        android:name="android.hardware.camera"
        android:required="true" />

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

To share and access the files created by other applications we need to add the following provider tag inside our application tag in the AndroidManifest.xml file.

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

This is required for retrieving the image captured by the camera in our QR code scanner for android application. Let’s start with the first one namely the PictureBarcodeActivity.java. The code for the xml layout activity_barcode_picture.xml is given below.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://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">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_centerHorizontal="true"
        android:src="@mipmap/journaldev_logo" />

    <TextView
        android:id="@+id/txtResultsHeader"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imageView"
        android:layout_centerHorizontal="true"
        android:text="Results"
        android:textSize="18sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/txtResultsBody"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txtResultsHeader"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="@dimen/activity_horizontal_margin"
        android:gravity="center" />

    <Button
        android:id="@+id/btnOpenCamera"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="@dimen/activity_horizontal_margin"
        android:layout_marginTop="@dimen/activity_horizontal_margin"
        android:text="@string/open_camera" />
</RelativeLayout>

The code for the PictureCodeActivity.java class is given below.

package com.journaldev.barcodevisionapi;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.vision.Frame;
import com.google.android.gms.vision.barcode.Barcode;
import com.google.android.gms.vision.barcode.BarcodeDetector;

import java.io.File;
import java.io.FileNotFoundException;

public class PictureBarcodeActivity extends AppCompatActivity implements View.OnClickListener {

    Button btnOpenCamera;
    TextView txtResultBody;

    private BarcodeDetector detector;
    private Uri imageUri;
    private static final int REQUEST_CAMERA_PERMISSION = 200;
    private static final int CAMERA_REQUEST = 101;
    private static final String TAG = "API123";
    private static final String SAVED_INSTANCE_URI = "uri";
    private static final String SAVED_INSTANCE_RESULT = "result";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_barcode_picture);

        initViews();

        if (savedInstanceState != null) {
            if (imageUri != null) {
                imageUri = Uri.parse(savedInstanceState.getString(SAVED_INSTANCE_URI));
                txtResultBody.setText(savedInstanceState.getString(SAVED_INSTANCE_RESULT));
            }
        }

        detector = new BarcodeDetector.Builder(getApplicationContext())
                .setBarcodeFormats(Barcode.DATA_MATRIX | Barcode.QR_CODE)
                .build();

        if (!detector.isOperational()) {
            txtResultBody.setText("Detector initialisation failed");
            return;
        }
    }

    private void initViews() {
        txtResultBody = findViewById(R.id.txtResultsBody);
        btnOpenCamera = findViewById(R.id.btnTakePicture);
        txtResultBody = findViewById(R.id.txtResultsBody);
        btnOpenCamera.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.btnTakePicture:
                ActivityCompat.requestPermissions(PictureBarcodeActivity.this, new
                        String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
                break;
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQUEST_CAMERA_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                    takeBarcodePicture();
                } else {
                    Toast.makeText(getApplicationContext(), "Permission Denied!", Toast.LENGTH_SHORT).show();
                }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
            launchMediaScanIntent();
            try {


                Bitmap bitmap = decodeBitmapUri(this, imageUri);
                if (detector.isOperational() && bitmap != null) {
                    Frame frame = new Frame.Builder().setBitmap(bitmap).build();
                    SparseArray<Barcode> barcodes = detector.detect(frame);
                    for (int index = 0; index < barcodes.size(); index++) {
                        Barcode code = barcodes.valueAt(index);
                        txtResultBody.setText(txtResultBody.getText() + "\n" + code.displayValue + "\n");

                        int type = barcodes.valueAt(index).valueFormat;
                        switch (type) {
                            case Barcode.CONTACT_INFO:
                                Log.i(TAG, code.contactInfo.title);
                                break;
                            case Barcode.EMAIL:
                                Log.i(TAG, code.displayValue);
                                break;
                            case Barcode.ISBN:
                                Log.i(TAG, code.rawValue);
                                break;
                            case Barcode.PHONE:
                                Log.i(TAG, code.phone.number);
                                break;
                            case Barcode.PRODUCT:
                                Log.i(TAG, code.rawValue);
                                break;
                            case Barcode.SMS:
                                Log.i(TAG, code.sms.message);
                                break;
                            case Barcode.TEXT:
                                Log.i(TAG, code.displayValue);
                                break;
                            case Barcode.URL:
                                Log.i(TAG, "url: " + code.displayValue);
                                break;
                            case Barcode.WIFI:
                                Log.i(TAG, code.wifi.ssid);
                                break;
                            case Barcode.GEO:
                                Log.i(TAG, code.geoPoint.lat + ":" + code.geoPoint.lng);
                                break;
                            case Barcode.CALENDAR_EVENT:
                                Log.i(TAG, code.calendarEvent.description);
                                break;
                            case Barcode.DRIVER_LICENSE:
                                Log.i(TAG, code.driverLicense.licenseNumber);
                                break;
                            default:
                                Log.i(TAG, code.rawValue);
                                break;
                        }
                    }
                    if (barcodes.size() == 0) {
                        txtResultBody.setText("No barcode could be detected. Please try again.");
                    }
                } else {
                    txtResultBody.setText("Detector initialisation failed");
                }
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), "Failed to load Image", Toast.LENGTH_SHORT)
                        .show();
                Log.e(TAG, e.toString());
            }
        }
    }

    private void takeBarcodePicture() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File photo = new File(Environment.getExternalStorageDirectory(), "pic.jpg");
        imageUri = FileProvider.getUriForFile(PictureBarcodeActivity.this,
                BuildConfig.APPLICATION_ID + ".provider", photo);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, CAMERA_REQUEST);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        if (imageUri != null) {
            outState.putString(SAVED_INSTANCE_URI, imageUri.toString());
            outState.putString(SAVED_INSTANCE_RESULT, txtResultBody.getText().toString());
        }
        super.onSaveInstanceState(outState);
    }

    private void launchMediaScanIntent() {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        mediaScanIntent.setData(imageUri);
        this.sendBroadcast(mediaScanIntent);
    }

    private Bitmap decodeBitmapUri(Context ctx, Uri uri) throws FileNotFoundException {
        int targetW = 600;
        int targetH = 600;
        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        bmOptions.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(ctx.getContentResolver().openInputStream(uri), null, bmOptions);
        int photoW = bmOptions.outWidth;
        int photoH = bmOptions.outHeight;

        int scaleFactor = Math.min(photoW / targetW, photoH / targetH);
        bmOptions.inJustDecodeBounds = false;
        bmOptions.inSampleSize = scaleFactor;

        return BitmapFactory.decodeStream(ctx.getContentResolver()
                .openInputStream(uri), null, bmOptions);
    }
}

Few inferences drawn from the above code are given below.

  • The following code creates a Barcode Detector.

    detector = new BarcodeDetector.Builder(getApplicationContext())
               .setBarcodeFormats(Barcode.DATA_MATRIX | Barcode.QR_CODE)
               .build();
    
  • The types of formats to be scanned are set inside the method setBarcodeFormats().

  • takeBarcodePicture() function is where the camera is launched. To retrieve the image we use the launchMediaScanIntent() that calls a broadcast Intent to search for the image using the image URI.

  • A Frame.Builder is used to create a frame of the Bitmap image. Over the frame, the Barcode detector scans for the possible QR Codes. The following line in the above code creates a Frame out of the Bitmap.

    Frame frame = new Frame.Builder().setBitmap(bitmap).build();
    
  • We’ve created a SparseArray that’ll contain all possible QR Codes present in the image by invoking the detect() method over the Barcode Detector.

    SparseArray<Barcode> barcodes = detector.detect(frame);
    

    To get the format of the QR Code, the valueFormat field is called over the Barcode instance as shown below.

    barcodes.valueAt(index).valueFormat
    
  • To get the displayed value and the raw values, the following are invoked.

    barcodes.valueAt(index).displayValue
    barcodes.valueAt(index).rawValue
    
  • The relevant value returned is displayed in the TextView. For then one Barcodes in a Bitmap, their values are appended to the current TextView.

The ScannedBarcodeActivity.java class scans for the Barcode through the camera. We’ve generated two of our own custom QR Codes from here. The code for the layout of the activity_scan_barcode.xml is given below.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/activity_horizontal_margin">

    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/btnAction"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true" />

    <TextView
        android:id="@+id/txtBarcodeValue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="@dimen/activity_horizontal_margin"
        android:layout_marginStart="@dimen/activity_horizontal_margin"
        android:text="No Barcode Detected"
        android:textColor="@android:color/white"
        android:textSize="20sp" />


    <Button
        android:id="@+id/btnAction"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="ADD CONTENT IN THE MAIL" />

</RelativeLayout>

Barcode Scanner for Android from Camera

The code for the ScannedBarcodeActivity.java is given below.

package com.journaldev.barcodevisionapi;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
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 android.widget.Toast;

import com.google.android.gms.vision.CameraSource;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.barcode.Barcode;
import com.google.android.gms.vision.barcode.BarcodeDetector;

import java.io.IOException;

public class ScannedBarcodeActivity extends AppCompatActivity {

    SurfaceView surfaceView;
    TextView txtBarcodeValue;
    private BarcodeDetector barcodeDetector;
    private CameraSource cameraSource;
    private static final int REQUEST_CAMERA_PERMISSION = 201;
    Button btnAction;
    String intentData = "";
    boolean isEmail = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_barcode);

        initViews();
    }

    private void initViews() {
        txtBarcodeValue = findViewById(R.id.txtBarcodeValue);
        surfaceView = findViewById(R.id.surfaceView);
        btnAction = findViewById(R.id.btnAction);


        btnAction.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (intentData.length() > 0) {
                    if (isEmail)
                        startActivity(new Intent(ScannedBarcodeActivity.this, EmailActivity.class).putExtra("email_address", intentData));
                    else {
                        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(intentData)));
                    }
                }


            }
        });
    }

    private void initialiseDetectorsAndSources() {

        Toast.makeText(getApplicationContext(), "Barcode scanner started", Toast.LENGTH_SHORT).show();

        barcodeDetector = new BarcodeDetector.Builder(this)
                .setBarcodeFormats(Barcode.ALL_FORMATS)
                .build();

        cameraSource = new CameraSource.Builder(this, barcodeDetector)
                .setRequestedPreviewSize(1920, 1080)
                .setAutoFocusEnabled(true) //you should add this feature
                .build();

        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                try {
                    if (ActivityCompat.checkSelfPermission(ScannedBarcodeActivity.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
                        cameraSource.start(surfaceView.getHolder());
                    } else {
                        ActivityCompat.requestPermissions(ScannedBarcodeActivity.this, new
                                String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }


            }

            @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() {
                Toast.makeText(getApplicationContext(), "To prevent memory leaks barcode scanner has been stopped", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void receiveDetections(Detector.Detections<Barcode> detections) {
                final SparseArray<Barcode> barcodes = detections.getDetectedItems();
                if (barcodes.size() != 0) {


                    txtBarcodeValue.post(new Runnable() {

                        @Override
                        public void run() {

                            if (barcodes.valueAt(0).email != null) {
                                txtBarcodeValue.removeCallbacks(null);
                                intentData = barcodes.valueAt(0).email.address;
                                txtBarcodeValue.setText(intentData);
                                isEmail = true;
                                btnAction.setText("ADD CONTENT TO THE MAIL");
                            } else {
                                isEmail = false;
                                btnAction.setText("LAUNCH URL");
                                intentData = barcodes.valueAt(0).displayValue;
                                txtBarcodeValue.setText(intentData);

                            }
                        }
                    });

                }
            }
        });
    }


    @Override
    protected void onPause() {
        super.onPause();
        cameraSource.release();
    }

    @Override
    protected void onResume() {
        super.onResume();
        initialiseDetectorsAndSources();
    }
}

Few inferences drawn from the above code are given below.

  • SurfaceView is good to display camera preview images as it renders the GUI rapidly. The interface SurfaceHolder.Callback is used to receive information about changes that occur in the surface (in this case, the camera preview). SurfaceHolder.Callback implements three methods:

    • SurfaceChanged : This method is called when the size or the format of the surface changes.
    • SurfaceCreated : When, in the first instance, the surface is created, this method is called.
    • SurfaceDestroyed : This is called when the surface is destroyed.
  • CameraSource manages the camera in conjunction with an underlying detector. Here SurfaceView is the underlying detector. CameraSource.start() opens the camera and starts sending preview frames to the SurfaceView. CameraSource is created in the following way:

    cameraSource = new CameraSource.Builder(this, barcodeDetector)
                    .setRequestedPreviewSize(1920, 1080)
                    .setAutoFocusEnabled(true) //you should add this feature
                    .build();
    
  • We’ve assigned a processor on the Barcode Detector using setProcessor(). The interface contains the callback to the method receiveDetections() which receives the QR Code from the camera preview and adds them in the SparseArray.

  • The value of the QR Code is displayed in the TextView using a Runnable since the Barcodes are detected in a background thread.

  • In this example, we’ve created two barcodes using the generator. One contains the URL. The second contains an email address. On clicking the button, based on the QR code value detected, we’ll either launch the URL or send an email to the relevant email address detected from the QR Code.

The output of the PictureBarcodeActivity.java is given below. bar code scanner for android app The output of the ScannedBarcodeActivity.java activity in action is given below. QR Code scanner for android That’s all for QR code scanner project for android using Mobile Vision API. We’ve added the sample QR Codes to the source code. You can download the final Android QR Code Scanner/Barcode Scanner Project from the link below and play around with different QR Codes.

Download QR Code, Barcode Scanner Example Project

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the author(s)

Category:
Tutorial
Tags:

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
JournalDev
DigitalOcean Employee
DigitalOcean Employee badge
May 24, 2018

The best and easiest tutorial on android bar codes i have come across. Thanks man.

- Muhammad Ja’afar

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    August 23, 2018

    XML files missing @dimen definitions.

    - alex

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    August 31, 2018

    this has to made using sdk 26

    - Alex.S

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    June 28, 2019

    The minimum SDK can be 23.

    - fruitjam

      JournalDev
      DigitalOcean Employee
      DigitalOcean Employee badge
      December 4, 2018

      You need to put the dimens.xml in the res/values folder.

      - Hiroshi Kobayashi

        JournalDev
        DigitalOcean Employee
        DigitalOcean Employee badge
        September 6, 2018

        It is definitely the best and easiest tutorial. I saved a lot of time. THANKS

        - Guillaume

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          September 15, 2018

          No resource found that matches the given name (at ‘resource’ with value ‘@xml/provider_paths’). error

          - asm

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          September 21, 2018

          Where is ‘@xml/provider_paths’ code?

          - Suraj

            JournalDev
            DigitalOcean Employee
            DigitalOcean Employee badge
            November 10, 2018

            to get the missing resource either get the code below and copy the provider_paths.cml from res/xml or create a new xml folder in res folder and create provider_paths.xml file. Put this code inside At least that worked for me.

            - Rally

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              October 23, 2018

              How can we grab/surround just the barcode, just like Paytm?

              - Vaibhav

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                November 30, 2018

                EmailActivity.class??? at Scannedbarcode.java does match to any class mentioned by you?Please let me know if I am wrong. thanks

                - ricardo silveira

                  JournalDev
                  DigitalOcean Employee
                  DigitalOcean Employee badge
                  December 6, 2018

                  Hi brather … I have this problem, please help me " Error:Could not resolve all files for configuration ‘:app:debugCompileClasspath’. > Could not resolve com.google.android.gms:play-services-vision:11.8.0. Required by: project :app > No cached version of com.google.android.gms:play-services-vision:11.8.0 available for offline mode. > No cached version of com.google.android.gms:play-services-vision:11.8.0 available for offline mode. " -

                  - Yazan

                    JournalDev
                    DigitalOcean Employee
                    DigitalOcean Employee badge
                    December 10, 2018

                    Hi everybody, Thanks a lot Anupam Chugh for your nice tutorial. I have a problem in first section, when I run app and take picture from a QR code, always receive this message: “No barcode could be detected. Please try again.” ,even I tried multiple times and set the barcode picture over my phone screen edges, but problem was the same. What’s problem? why this problem happens? (P.S: maybe useful - My phone android OS is 4.4.4 and has no high quality camera ( HTC Desire 820), but it works good by other barcode scanner apps). Thanks for any help and sorry for my poor English!

                    - Reyhane.F

                      JournalDev
                      DigitalOcean Employee
                      DigitalOcean Employee badge
                      January 15, 2019

                      Hi, How to zoom the camera.

                      - ajmal

                        JournalDev
                        DigitalOcean Employee
                        DigitalOcean Employee badge
                        January 29, 2019

                        Easy Step by Step Instruction, Thanks

                        - Mujahideen

                          JournalDev
                          DigitalOcean Employee
                          DigitalOcean Employee badge
                          March 22, 2019

                          on resume method called multiple times please give solution

                          - Kinjal sakhiya

                            JournalDev
                            DigitalOcean Employee
                            DigitalOcean Employee badge
                            April 3, 2019

                            SparseArray barcodes = detections.getDetectedItems() QRcode is not getting scanned and Not getting any result in barcodes.

                            - 080dev

                              JournalDev
                              DigitalOcean Employee
                              DigitalOcean Employee badge
                              April 29, 2019

                              How to catch barcode format to string value ?

                              - Bryan Zadali

                              JournalDev
                              DigitalOcean Employee
                              DigitalOcean Employee badge
                              December 27, 2019

                              by setText() to the result

                              - singye

                                JournalDev
                                DigitalOcean Employee
                                DigitalOcean Employee badge
                                August 12, 2019

                                Hai, How do you make the barcode scan not automatic? I mean maybe by using a button on ScannedBarcodeActivity each will do a barcode scanning.

                                - Oren

                                  JournalDev
                                  DigitalOcean Employee
                                  DigitalOcean Employee badge
                                  August 22, 2019

                                  thank you sir

                                  - Nitesh singh

                                    JournalDev
                                    DigitalOcean Employee
                                    DigitalOcean Employee badge
                                    August 28, 2019

                                    hello sir I want to set camera zoom in the scanner. i have tried it with the camera api but it is now deprecated

                                    - dharmendra sharma

                                      JournalDev
                                      DigitalOcean Employee
                                      DigitalOcean Employee badge
                                      September 18, 2019

                                      Thanks a lot. It was very helpful to me — just download the source code and it will run perfectly.

                                      - Mohammad Hamayel

                                        JournalDev
                                        DigitalOcean Employee
                                        DigitalOcean Employee badge
                                        September 24, 2019

                                        can u create a tutorial to integrate firebase database into this barcode scanning app

                                        - ishan

                                          JournalDev
                                          DigitalOcean Employee
                                          DigitalOcean Employee badge
                                          December 23, 2019

                                          Awesome work! Thanks for sharing! :)

                                          - Yordan

                                            JournalDev
                                            DigitalOcean Employee
                                            DigitalOcean Employee badge
                                            January 7, 2020

                                            Truly an awesome read, hard to get such elaborate stuff on websites. Good job Anupam.

                                            - Facebook

                                              JournalDev
                                              DigitalOcean Employee
                                              DigitalOcean Employee badge
                                              January 7, 2020

                                              I saw that the bottom half said bar-code scanner. is part of the qr scanner or is it separate. ( all I want is a bar-code scanner)

                                              - reece

                                                JournalDev
                                                DigitalOcean Employee
                                                DigitalOcean Employee badge
                                                March 20, 2020

                                                I can’t find the EmailActivity.class in the ScannedBarcodeActivity.java and also showing error in SurfaceView in XML file. help me if you found the error thank you…

                                                - Keval Ramani

                                                JournalDev
                                                DigitalOcean Employee
                                                DigitalOcean Employee badge
                                                May 18, 2020

                                                Hi! The code fro EmailActivity.java etc can be found in the downloadable example project folder :D (There are some other files to download as well)

                                                - Rallie

                                                  JournalDev
                                                  DigitalOcean Employee
                                                  DigitalOcean Employee badge
                                                  May 3, 2020

                                                  Hi Anupam, Thanks very much for such a detailed post! I just wanted the QR Code scanning functionality, so utilised only “ScannedBarCodeActivity.java” snippet and added the Camera related code, including “ActivityCompat.requestPermissions…” in the else block of surfaceCreated check. However it is showing only the blank SurfaceView with “No QR Code Detected” in the TextView. Even if I add “cameraSource.start()” the camera feed is not getting into the TextView box. But when I go back to the previous screen and tap the “Scan Bar Code” button, the camera feed happens. Can you please let me know how to fix this issue, such that the SurfaceView starts showing the image preview in the first instance after installing the app and granting permission? Many thanks, Vaidya.

                                                  - Vaidya

                                                    JournalDev
                                                    DigitalOcean Employee
                                                    DigitalOcean Employee badge
                                                    July 23, 2020

                                                    HI , Thank you for your valuable content. I am suffering with one issue. When we got incoming calls, while camera is on and looking for Barcodes. at that time view is gettting freezed. How to restart the process when cal dismisses. Same logic in onResume not working. Pls help me resolving this issue.

                                                    - Srikanth

                                                      JournalDev
                                                      DigitalOcean Employee
                                                      DigitalOcean Employee badge
                                                      September 9, 2020

                                                      scan barcode button is not working.It opens the camera but never capture barcode…plz help me to find out the issue

                                                      - learner

                                                      JournalDev
                                                      DigitalOcean Employee
                                                      DigitalOcean Employee badge
                                                      December 5, 2020

                                                      That is because of the bug in the code: activity_barcode_picture.xml does not have btnTakePicture. Yet your code in PictureCodeActivity.java tries to create a Button object btnOpenCamera = findViewById(R.id.btnTakePicture); and next onClick Lstener too switch case looks for btnTakePicture. We get NPE.

                                                      - Fermi

                                                        JournalDev
                                                        DigitalOcean Employee
                                                        DigitalOcean Employee badge
                                                        March 3, 2022

                                                        Hi, congrats with this tutorial, very easy and simple to implement. I wonder if with this example we can draw lines around the barcode as if it is detecting.

                                                        - Ricardo Etcheverry

                                                          JournalDev
                                                          DigitalOcean Employee
                                                          DigitalOcean Employee badge
                                                          March 6, 2022

                                                          The bar code is working but not storing the data. What to do for fixing this bug? Does any help from anyone?

                                                          - Muzahid

                                                            Join the Tech Talk
                                                            Success! Thank you! Please check your email for further details.

                                                            Please complete your information!

                                                            Become a contributor for community

                                                            Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

                                                            DigitalOcean Documentation

                                                            Full documentation for every DigitalOcean product.

                                                            Resources for startups and SMBs

                                                            The Wave has everything you need to know about building a business, from raising funding to marketing your product.

                                                            Get our newsletter

                                                            Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

                                                            New accounts only. By submitting your email you agree to our Privacy Policy

                                                            The developer cloud

                                                            Scale up as you grow — whether you're running one virtual machine or ten thousand.

                                                            Get started for free

                                                            Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

                                                            *This promotional offer applies to new accounts only.