For qr code and barcode reader app for android phone, At some point of the development of Android application, occasionally it is required to provide a functionality that scans a QR code or barcode. Scanning the QR code can be achieved programmatically by means of the usage of many approaches:
- the usage of an internet-based API, where the QR code or barcode is uploaded to the server, and the server returns the results.
- the usage of an internet-based totally utility that accesses your camera and scans the QR code or barcode and returns the results.
- by means of Integrating the Mobile Vision API of Google Play Service.
Here we are going to share the world how to create qr code or barcode reader app for android phone with certain steps.
QR Code Scanner Example
In this example, we will scan the QR code of a web URL and Email address, and act on it. Here we will use the Mobile Vision API of Google Play Service to scan the QR code. The Mobile Vision API supports the following formats of the barcode.
- 1D barcodes: EAN-8, UPC-A, EAN-13, EAN-8, UPC-E, Code-93, Code-128, Code-39, Codabar, ITF.
- 2D barcodes: QR Code, Data Matrix, AZTEC, PDF-417.
Create an activity_main.xml and add the following code.
- <?xml version="1.0" encoding="utf-8"?>
- <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="example.com.qrcodebarcodescanner.MainActivity">
- <Button
- android:id="@+id/btnScanBarcode"
- android:layout_width="300dp"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_marginBottom="44dp"
- android:layout_marginEnd="8dp"
- android:layout_marginStart="8dp"
- android:text="@string/scan_barcode"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.676"
- app:layout_constraintStart_toStartOf="parent" />
- </android.support.constraint.ConstraintLayout>
Create an activity_scanned_barcode.xml layout and add the following code. The SurfaceView widget is used for camera source.
activity_scanned_barcode.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: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>
Create an activity_email.xml layout to perform email action.
activity_email.xml
- <?xml version="1.0" encoding="utf-8"?>
- <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="example.com.qrcodebarcodescanner.EmailActivity">
- <Button
- android:id="@+id/btnSendEmail"
- android:layout_width="300dp"
- android:layout_height="wrap_content"
- android:layout_below="@+id/inBody"
- android:layout_centerHorizontal="true"
- android:layout_marginBottom="64dp"
- android:layout_marginEnd="8dp"
- android:layout_marginStart="8dp"
- android:text="@string/send_email"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent" />
- <TextView
- android:id="@+id/txtEmailAddress"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_marginBottom="8dp"
- android:layout_marginEnd="8dp"
- android:layout_marginStart="8dp"
- android:layout_marginTop="8dp"
- android:text="Email Address: "
- android:textSize="16dp"
- android:textStyle="bold"
- app:layout_constraintBottom_toTopOf="@+id/inSubject"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
- <EditText
- android:id="@+id/inSubject"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@+id/txtEmailAddress"
- android:layout_centerHorizontal="true"
- android:layout_marginEnd="8dp"
- android:layout_marginStart="8dp"
- android:layout_marginTop="88dp"
- android:ems="10"
- android:hint="Subject"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
- <EditText
- android:id="@+id/inBody"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@+id/inSubject"
- android:layout_centerHorizontal="true"
- android:layout_marginEnd="8dp"
- android:layout_marginStart="8dp"
- android:layout_marginTop="164dp"
- android:ems="10"
- android:hint="Body"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="1.0"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
- </android.support.constraint.ConstraintLayout>
Add the Google Mobile Vision API in build.gradle file.
build.gradle
In the MainActivity.java file, add the following code. By clicking the button btnScanBarcode it call the ScannedBarcodeActivity.java class.
MainActivity.java
- package example.com.qrcodebarcodescanner;
- 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 {
- Button btnScanBarcode;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btnScanBarcode = findViewById(R.id.btnScanBarcode);
- btnScanBarcode.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- startActivity(new Intent(MainActivity.this, ScannedBarcodeActivity.class));
- }
- });
- }
- }
In the ScannedBarcodeActivity.java activity class, add the following code. This class scans the QR code through the camera. In this class, we will generate two QR code, one for web URL and another is for an email address. A QR code can be generated from any of QR code generator website.
ScannedBarcodeActivity.java
- package example.com.qrcodebarcodescanner;
- 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_scanned_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();
- }
- }
In the EmailActivity.java class, add the following code. This class performs the email sending task to the address mention in the QR code.
EmailActivity.java
- package example.com.qrcodebarcodescanner;
- import android.content.Intent;
- import android.os.Bundle;
- import android.support.v7.app.AppCompatActivity;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.TextView;
- public class EmailActivity extends AppCompatActivity implements View.OnClickListener {
- EditText inSubject, inBody;
- TextView txtEmailAddress;
- Button btnSendEmail;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_email);
- initViews();
- }
- private void initViews() {
- inSubject = findViewById(R.id.inSubject);
- inBody = findViewById(R.id.inBody);
- txtEmailAddress = findViewById(R.id.txtEmailAddress);
- btnSendEmail = findViewById(R.id.btnSendEmail);
- if (getIntent().getStringExtra("email_address") != null) {
- txtEmailAddress.setText("Recipient : " + getIntent().getStringExtra("email_address"));
- }
- btnSendEmail.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(Intent.ACTION_SEND);
- intent.setType("text/plain");
- intent.putExtra(Intent.EXTRA_EMAIL, new String[]{txtEmailAddress.getText().toString()});
- intent.putExtra(Intent.EXTRA_SUBJECT, inSubject.getText().toString().trim());
- intent.putExtra(Intent.EXTRA_TEXT, inBody.getText().toString().trim());
- startActivity(Intent.createChooser(intent, "Send Email"));
- }
- });
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btnScanBarcode:
- startActivity(new Intent(EmailActivity.this, ScannedBarcodeActivity.class));
- break;
- }
- }
- }
Add the following code in AndroidMenifest.xml file.
AndroidMenifest.java
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="example.com.qrcodebarcodescanner">
- <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" />
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:roundIcon="@mipmap/ic_launcher_round"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity android:name=".MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".ScannedBarcodeActivity" />
- <activity
- android:name=".EmailActivity"
- android:windowSoftInputMode="adjustPan" />
- </application>
- </manifest>
ouput:
I hope this will helpfull to you please share this article if posible.
- Get link
- X
- Other Apps
- Get link
- X
- Other Apps
Comments
Post a Comment