如何在同一活动中使用Google视觉API两次扫描条形码?

时间:2018-08-23 17:16:02

标签: android barcode-scanner google-vision vision-api

Activity screenshot

在以上活动中,我必须扫描两个不同的条形码并将其值分配给每个EditText。但是我做不到。我尝试了许多逻辑方法,但没有一个起作用。

activity_scan_qr.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=".ScanQR">
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:id="@+id/ref"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar2"
        app:titleTextColor="#000000"
        app:title="Scan Barcode"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />
    </android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.CardView
        android:id="@+id/cv_qrcode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="16dp"
        android:elevation="10dp"
        app:cardCornerRadius="50dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.482"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ref"
        app:layout_constraintVertical_bias="0.071">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <SurfaceView

                android:id="@+id/camera_pre"
                android:layout_width="350dp"
                android:layout_height="350dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <ImageView
                android:id="@+id/imageView9"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="8dp"
                android:layout_marginEnd="8dp"
                android:layout_marginStart="8dp"
                android:layout_marginTop="8dp"
                app:layout_constraintBottom_toBottomOf="@+id/camera_pre"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="@+id/camera_pre"
                app:layout_constraintTop_toTopOf="@+id/camera_pre"
                app:srcCompat="@drawable/qr_overlay" />
        </android.support.constraint.ConstraintLayout>

    </android.support.v7.widget.CardView>

    <EditText
        android:id="@+id/beacon_edittext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="20dp"
        android:background="@drawable/search_bar"
        android:ems="10"
        android:hint="Enter Beacon number"
        android:inputType="textPersonName"
        android:paddingBottom="5dp"
        android:paddingLeft="50dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.491"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/cv_qrcode" />

    <EditText
        android:id="@+id/vin_edittext"
        android:layout_width="wrap_content"

        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:background="@drawable/search_bar"
        android:ems="10"
        android:hint="Enter VIN number"
        android:inputType="textPersonName"
        android:paddingBottom="5dp"
        android:paddingLeft="50dp"

        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.491"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/beacon_edittext"
        app:layout_constraintVertical_bias="0.0" />

    <Button
        android:id="@+id/assign"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="assign"
        android:background="@drawable/assign"
        android:textColor="@color/colorPrimary"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/vin_edittext" />




</android.support.constraint.ConstraintLayout> 

ScanQR.java

package anaghesh.beacons_test;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
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.EditText;

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;

// IMP: Google vision API used. Formats to be controlled

public class ScanQR extends AppCompatActivity {

    SurfaceView cameraPreview;
    EditText beacon,vin;
    BarcodeDetector barcodeDetector;
    CameraSource cameraSource;
    Button assign;
    public final static String BEACON_NUM="Beacon_num";
    public final static String VIN_NUM="vin_num";


    final int RequestCameraPermissionID = 1001;


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        cameraPreview =  findViewById(R.id.camera_pre);

        switch (requestCode) {
            case RequestCameraPermissionID: {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    try {
                        cameraSource.start(cameraPreview.getHolder());

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_qr);
        toolbarSetup();
        cameraPreview =  findViewById(R.id.camera_pre);
        Log.e("error",""+cameraPreview);
        beacon = findViewById(R.id.beacon_edittext);
        beacon.setText("");//test

        vin = findViewById(R.id.vin_edittext);
        vin.setText("");//test
        assign = findViewById(R.id.assign);
        assign.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences sharedPreferences = getSharedPreferences("Database", MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putString(BEACON_NUM,beacon.getText().toString());
                editor.putString(VIN_NUM,vin.getText().toString());
                editor.apply();
                final android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(ScanQR.this);
                builder.setTitle("Checkin Successful");
                //  builder.setIcon(R.mipmap.ic_launcher);
                builder.setMessage("Beacon No. "+sharedPreferences.getString(BEACON_NUM,"")+" is assigned to VIN "+sharedPreferences.getString(VIN_NUM,""))
                        .setCancelable(false)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                               finish();
                            }
                        });
                android.app.AlertDialog alert = builder.create();
                alert.show();

            }
        });
        barcodeDetector = new BarcodeDetector.Builder(this)
              //  .setBarcodeFormats(Barcode.QR_CODE)
                .build();
        cameraSource = new CameraSource
                .Builder(this, barcodeDetector)
                .setRequestedPreviewSize(640, 480)
                .build();
        //Add Event
        alert();
        cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                if (ActivityCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                    //Request permission
                    ActivityCompat.requestPermissions(ScanQR.this,
                            new String[]{Manifest.permission.CAMERA},RequestCameraPermissionID);
                    return;
                }
                try {
                    cameraSource.start(cameraPreview.getHolder());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                cameraSource.stop();

            }
        });

        barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
            @Override
            public void release() {

            }

            @Override
            public void receiveDetections(Detector.Detections<Barcode> detections) {
                final SparseArray<Barcode> qrcodes = detections.getDetectedItems();
                if(qrcodes.size() != 0)
                {
                    beacon.post(new Runnable() {
                        @Override
                        public void run() {
                            cameraSource.stop( );
                            Log.e("QR ",""+qrcodes.valueAt(0).displayValue);

                            Log.e("Beacon ",""+beacon.getText().toString());

                            Log.e("VIN ",""+vin.getText().toString());

                            if(beacon.getText().toString().isEmpty()) {
                                beacon.setText(qrcodes.valueAt(0).displayValue);
                                vinAlert();
                            }
                            else {
                                vin.setText(qrcodes.valueAt(0).displayValue);
                            }
                            Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                            vibrator.vibrate(100);


                        }
                    });

                }

            }

        });
    }
    void toolbarSetup(){
        Toolbar toolbar = findViewById(R.id.toolbar2);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
    void alert(){
        final android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(ScanQR.this);
        builder.setTitle("Scan Beacon Barcode");
        //  builder.setIcon(R.mipmap.ic_launcher);
        builder.setMessage("Please scan the beacon barcode")
                .setCancelable(false)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                    }
                });
        android.app.AlertDialog alert = builder.create();
        alert.show();

    }
    void vinAlert(){
        final android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(ScanQR.this);
        builder.setTitle("Scan Car Barcode");
        //  builder.setIcon(R.mipmap.ic_launcher);
        builder.setMessage("Please scan the car barcode")
                .setCancelable(false)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        restartCamera();
                    }
                });
        android.app.AlertDialog alert = builder.create();
        alert.show();
    }


    @SuppressLint("MissingPermission")
    public void restartCamera()
    {
        Log.e("method","Restart Camera");
        try {
            cameraSource.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

0 个答案:

没有答案