BarcodeReader Decode возвращает ноль, когда приложение возобновляет работу и сканирует матрицу данных? - PullRequest
0 голосов
/ 15 февраля 2019

Я разрабатывал AR-приложение с использованием Vuforia и Zxing в движке Unity.

Метод декодирования Zxing BarcodeReader возвращает текст штрих-кода, если только приложение запускается и сканируется в первый раз.Но когда приложение приостанавливается и возобновляется или переключается на другое приложение (браузер) и возвращается к этому приложению, декодирование не возвращает значение (ноль).

Мой код выглядит следующим образом, я воссоздал свежий объект BarcodeReader с методом OnApplicationPause .Но это не сработало.

[AddComponentMenu("System/ArCamCapture")]
public class ArCamCapture : MonoBehaviour
{

    private readonly Image.PIXEL_FORMAT m_PixelFormat = Image.PIXEL_FORMAT.RGB888;
    private bool _CameraInitialized;

    private BarcodeReader _BarCodeReader;


    void Start()
    {
        try
        {
            _BarCodeReader = new BarcodeReader();

            StartCoroutine(InitializeCamera());                

            VuforiaARController.Instance.RegisterTrackablesUpdatedCallback(OnTrackablesUpdated);
            VuforiaARController.Instance.RegisterVuforiaStartedCallback(OnVuforiaStarted);
        }
        catch (Exception ex)
        {
            SSTools.ShowMessage("Error : " + ex.Message, SSTools.Position.bottom, SSTools.Time.twoSecond);
        }

    }

    /// <summary>
    /// Initialize AR camera to detect barcode
    /// </summary>
    /// <returns></returns>
    private IEnumerator InitializeCamera()
    {
        // Waiting a little seem to avoid the Vuforia's crashes.
        yield return new WaitForSeconds(1.25f);

        CameraDevice.Instance.SetFrameFormat(Image.PIXEL_FORMAT.RGB888, true);
        // Force autofocus.
        var isAutoFocus = CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
        if (!isAutoFocus)
        {
            CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_NORMAL);
        }
        _CameraInitialized = true;
        _BarCodeReader.Options.PossibleFormats.Add(BarcodeFormat.DATA_MATRIX);           
    }

    /// <summary>
    /// AR camera tracking change
    /// </summary>
    public void OnTrackablesUpdated()
    {
        try
        {
            KeyInputHanlde();
            if (Application.internetReachability == NetworkReachability.NotReachable)
            {
                SSTools.ShowMessage("check your internet connection", SSTools.Position.bottom, SSTools.Time.threeSecond);
                return;
            }

            if (CameraDevice.Instance.SetFrameFormat(m_PixelFormat, true) && _CameraInitialized)
            {
                Image image = CameraDevice.Instance.GetCameraImage(m_PixelFormat);

                if (image == null)
                {
                    SSTools.ShowMessage("image is not available yet", SSTools.Position.bottom, SSTools.Time.twoSecond);
                }

                else
                {
                    var data = _BarCodeReader.Decode(image.Pixels, image.BufferWidth, image.BufferHeight, RGBLuminanceSource.BitmapFormat.RGB24);
                    if (data != null)
                    {
                        //user code
                    }
                    else
                    {
                            SSTools.ShowMessage("Scanning ...", SSTools.Position.bottom, SSTools.Time.twoSecond);                            

                    }
                }

            }
        }
        catch (Exception ex)
        {
            SSTools.ShowMessage("Error : " + ex.Message, SSTools.Position.bottom, SSTools.Time.twoSecond);
            _CameraInitialized = true;
        }

    }

    /// <summary>
    /// When Vuforia camera is on
    /// </summary>
    private void OnVuforiaStarted()
    {
        CameraDevice.Instance.SetFocusMode(
            CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
    }

    /// <summary>
    /// When android application is OnResume and OnPause state
    /// </summary>
    /// <param name="pauseStatus"></param>
    private void OnApplicationPause(bool isPaused)
    {
        if (!isPaused)
        {                
            SSTools.ShowMessage($"is paused: {isPaused}", SSTools.Position.bottom, SSTools.Time.oneSecond);
            CameraDevice.Instance.SetFocusMode(
            CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
            CameraDevice.Instance.SetFrameFormat(Image.PIXEL_FORMAT.RGB888, true);
            _BarCodeReader = new BarcodeReader();
            _BarCodeReader.Options.PossibleFormats.Add(BarcodeFormat.DATA_MATRIX);                
        }

    }

}

Какую конфигурацию я здесь пропустил?Спасибо

...