Search code examples
androidandroid-fragmentszxing

Android zxing Embedded BarcodeView not resuming


In my android app I use a Fragment (CameraFragment see below) which uses a BarcodeView. When a Barcode is scanned(BarcodeCallBack) I check if it fits a pattern and if not I want to resume the scanning, but this does not work. The camera keeps running but no Barcode is scanned. As a quickfix I replace the entire Fragment but this is not how it has to be...

The Fragment:

package com.stickydata;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.amazonaws.mobile.AWSMobileClient;
import com.amazonaws.mobilehelper.auth.IdentityManager;
import com.google.zxing.ResultPoint;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.BarcodeView;
import com.stickydata.AWSUtil.SDtagUtil;
import com.stickydata.events.EventResumeBarcodeScan;

import org.greenrobot.eventbus.EventBus;

import java.util.List;

import static com.facebook.FacebookSdk.getApplicationContext;

public class CameraFragment extends Fragment  {
    private IdentityManager identityManager;
Context mcontext;
    private BarcodeView barcodeView;
    final int PERMISSIONS_REQUEST_ACCESS_CAMERA=0;
    View view;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        view=inflater.inflate(R.layout.fragment_camera, container, false);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                getActivity().checkSelfPermission(Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.CAMERA},
                    PERMISSIONS_REQUEST_ACCESS_CAMERA);
        } else {
            barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
            barcodeView.decodeSingle(callback);

        }


        mcontext=getContext();

        return view;
    }



    @Override
    public void onResume() {

        super.onResume();
        barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
        barcodeView.resume();
        barcodeView.decodeSingle(callback);

    }

    @Override
    public void onPause() {
        super.onPause();
        barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
        barcodeView.pause();
    }


    private BarcodeCallback callback = new BarcodeCallback() {
        @Override
        public void barcodeResult(BarcodeResult result) {
            if (result.getText() != null) {
                barcodeView.pause();
                //the vibrator on success
                Vibrator v = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
               // Vibrate for 500 milliseconds
                v.vibrate(200);
               //after the string has been read we prozess it
                String tag_string=result.getText();
                AWSMobileClient.initializeMobileClientIfNecessary(getApplicationContext());
                // Obtain a reference to the mobile client. It is created in the Application class.
                final AWSMobileClient awsMobileClient = AWSMobileClient.defaultMobileClient();

                // Obtain a reference to the identity manager.
                identityManager = awsMobileClient.getIdentityManager();
                SDtagUtil sdTag=new SDtagUtil(tag_string,identityManager,awsMobileClient,mcontext);

                if(!sdTag.prozessTag()){//if the tag was not scanned succesfully let us start the scan again
                    EventBus.getDefault().post(new EventResumeBarcodeScan("bla"));
                    //TODO NOT WORKING
                  //  barcodeView.resume();
                  //  barcodeView.decodeSingle(callback);

                }


            }


        }

        @Override
        public void possibleResultPoints(List<ResultPoint> resultPoints) {
        }
    };

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == PERMISSIONS_REQUEST_ACCESS_CAMERA|| grantResults!=null) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
                barcodeView.decodeContinuous(callback);
            }
        }
    }
}

The fragment xml file

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <com.journeyapps.barcodescanner.BarcodeView
        android:id="@+id/barcode_scanner"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:zxing_use_texture_view="true"
    app:zxing_preview_scaling_strategy="fitCenter"/>
</LinearLayout>

Changed to decodeContinous as suggested. The problem remains:

package com.stickydata;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.amazonaws.mobile.AWSMobileClient;
import com.amazonaws.mobilehelper.auth.IdentityManager;
import com.google.zxing.ResultPoint;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.BarcodeView;
import com.stickydata.AWSUtil.SDtagUtil;
import com.stickydata.events.EventResumeBarcodeScan;

import org.greenrobot.eventbus.EventBus;

import java.util.List;

import static com.facebook.FacebookSdk.getApplicationContext;

public class CameraFragment extends Fragment  {
    private IdentityManager identityManager;
Context mcontext;
    private BarcodeView barcodeView;
    final int PERMISSIONS_REQUEST_ACCESS_CAMERA=0;
    View view;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        view=inflater.inflate(R.layout.fragment_camera, container, false);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                getActivity().checkSelfPermission(Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.CAMERA},
                    PERMISSIONS_REQUEST_ACCESS_CAMERA);
        } else {
            barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
            barcodeView.decodeContinuous(callback);

        }


        mcontext=getContext();

        return view;
    }



    @Override
    public void onResume() {

        super.onResume();
        barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
        barcodeView.resume();
        barcodeView.decodeContinuous(callback);

    }

    @Override
    public void onPause() {
        super.onPause();
        barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
        barcodeView.pause();
    }


    private BarcodeCallback callback = new BarcodeCallback() {
        @Override
        public void barcodeResult(BarcodeResult result) {
            if (result.getText() != null) {
                barcodeView.pause();
                //the vibrator on success
                Vibrator v = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
               // Vibrate for 500 milliseconds
                v.vibrate(200);
               //after the string has been read we prozess it
                String tag_string=result.getText();
                AWSMobileClient.initializeMobileClientIfNecessary(getApplicationContext());
                // Obtain a reference to the mobile client. It is created in the Application class.
                final AWSMobileClient awsMobileClient = AWSMobileClient.defaultMobileClient();

                // Obtain a reference to the identity manager.
                identityManager = awsMobileClient.getIdentityManager();
                SDtagUtil sdTag=new SDtagUtil(tag_string,identityManager,awsMobileClient,mcontext);

                if(!sdTag.prozessTag()){//if the tag was not scanned succesfully let us start the scan again
                   // EventBus.getDefault().post(new EventResumeBarcodeScan("bla"));
                    //TODO NOT WORKING
                    barcodeView.resume();
                    barcodeView.decodeContinuous(callback);

                }


            }


        }

        @Override
        public void possibleResultPoints(List<ResultPoint> resultPoints) {
        }
    };

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == PERMISSIONS_REQUEST_ACCESS_CAMERA|| grantResults!=null) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
                barcodeView.decodeContinuous(callback);
            }
        }
    }
}

Solution

  • Hi user1406731 you are using the wrong callback, we do something similar in our mobile app. Replace your decodeSingle() callback function with decodeContinuous() callback and it should work. Here is a working example from the official doc Continous Callback example. Hope it helps you.

    Hi i tried to run your code & made a little change. This is what i tested and works fine for me

    import android.Manifest;
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import com.google.zxing.ResultPoint;
    import com.journeyapps.barcodescanner.BarcodeCallback;
    import com.journeyapps.barcodescanner.BarcodeResult;
    import com.journeyapps.barcodescanner.BarcodeView;
    import com.example.scanner.R;
    import com.example.scanner.ui.base.BaseFragment;
    
    import java.util.List;
    
    /**
     * Created by Rishabh Bhatia on 12/5/17.
     */
    
    public class CameraFragment extends BaseFragment {
        Context mcontext;
        private BarcodeView barcodeView;
        final int PERMISSIONS_REQUEST_ACCESS_CAMERA=0;
        View view;
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
    
            view=inflater.inflate(R.layout.fragment_camera, container, false);
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                    getActivity().checkSelfPermission(Manifest.permission.CAMERA)
                            != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.CAMERA},
                        PERMISSIONS_REQUEST_ACCESS_CAMERA);
            } else {
                barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
                barcodeView.decodeContinuous(callback);
    
            }
    
    
            mcontext=getContext();
    
            return view;
        }
    
    
    
        @Override
        public void onResume() {
    
            super.onResume();
            barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
            barcodeView.resume();    
        }
    
        @Override
        public void onPause() {
            super.onPause();
            barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
            barcodeView.pause();
        }
    
        private BarcodeCallback callback = new BarcodeCallback() {
            @Override
            public void barcodeResult(BarcodeResult result) {
                if (result.getText() != null) {
                    barcodeView.pause();
                    //after the string has been read we prozess it
                    String tag_string=result.getText();
                    Log.e("RISHABH", "pausing scanner, got some data "+tag_string);
    
                    if(!tag_string.equals("abc")){//if the tag was not scanned succesfully let us start the scan again
                        Log.e("RISHABH", "resuming scanner, data needed was not found");
                        barcodeView.resume(); //notice we don't call decodeContinuous function again
                    }
                }
            }
    
            @Override
            public void possibleResultPoints(List<ResultPoint> resultPoints) {
            }
        };
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
            if (requestCode == PERMISSIONS_REQUEST_ACCESS_CAMERA) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
                    barcodeView.decodeContinuous(callback);
                }
            }
        }
    }
    

    Here is my logcat

    05-12 23:54:13.226 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
    05-12 23:54:13.226 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
    05-12 23:54:18.280 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
    05-12 23:54:18.280 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
    05-12 23:54:19.350 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
    05-12 23:54:19.350 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
    05-12 23:54:20.350 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
    05-12 23:54:20.350 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
    05-12 23:54:21.450 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
    05-12 23:54:21.450 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
    05-12 23:54:22.510 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
    05-12 23:54:22.510 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
    05-12 23:54:33.000 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data abc