Android-сканер Zebra не выполняет повторную инициализацию в Activity - PullRequest
0 голосов
/ 04 июня 2018

Я создаю приложение Xamarin.Android для устройства Zebra TC-70 Android.Мое основное занятие - запускать сканер с первого раза.Он получает данные со сканера, а затем просто передает данные другому виду деятельности.Если я отменю новое действие или завершу свою работу и вернусь к первому действию, сканер не будет повторно инициализирован.Вот мой код:

[Activity(Label       = "MyApp", MainLauncher = true, Icon = "@mipmap/icon",
    ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : AppCompatActivity, EMDKManager.IEMDKListener
{
    //EMDK
    private BarcodeManager _barcodeManager;
    private EMDKManager _emdkManager;
    private EditText                  _scanBarcodeEditText;
    private Scanner                   _scanner;

    void EMDKManager.IEMDKListener.OnClosed()
    {
        if(_emdkManager != null)
        {
            _emdkManager.Release();
            _emdkManager = null;
        }
    }

    void EMDKManager.IEMDKListener.OnOpened(EMDKManager p0)
    {
        _emdkManager = p0;
        InitScanner();
    }

    protected override void OnResume()
    {
        base.OnResume();
        var intent = new Intent(this, typeof(FpmsDataService));
        BindService(intent, _dataServiceConnection, Bind.AutoCreate);
        _scanBarcodeEditText.Text = string.Empty;
        InitScanner();

    }

    protected override void OnPause()
    {

        base.OnPause();
        UnbindService(_dataServiceConnection);
        DeinitScanner();
        if (_emdkManager != null)
        {
            _emdkManager.Release();
            _emdkManager = null;
        }
    }

    protected override void OnDestroy()
    {
        base.OnDestroy();
        DeinitScanner();
        if(_emdkManager != null)
        {
            _emdkManager.Release();
            _emdkManager = null;
        }
        Log.Information("Destroyed FirePMS MainActivity");
        Log.CloseAndFlush();
    }
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Window.SetFlags(WindowManagerFlags.KeepScreenOn, WindowManagerFlags.KeepScreenOn);
        SetContentView(Resource.Layout.Main);
        _scanBarcodeEditText    = FindViewById<EditText>(Resource.Id.MaintenanceScanBarcode_EditText);
        //Initialize Scanner
        var results = EMDKManager.GetEMDKManager(Application.Context, this);
    }
    private void InitScanner()
    {
        if(_emdkManager != null)
        {
            if(_barcodeManager == null)
            {
                try
                {
                    //Get the feature object such as BarcodeManager object for accessing the feature.
                    _barcodeManager = (BarcodeManager)_emdkManager.GetInstance(EMDKManager.FEATURE_TYPE.Barcode);

                    _scanner = _barcodeManager.GetDevice(BarcodeManager.DeviceIdentifier.Default);

                    if (_scanner != null)
                    {
                        //Attach the Data Event handler to get the data callbacks.
                        _scanner.Data += Scanner_Data;
                        _scanner.Status += Scanner_Status;

                        _scanner.Enable();
                    }
                    else
                    {
                        Log.Error("Failed to enable scanner");
                    }
                }
                catch (ScannerException e)
                {
                    Log.Error(e.Message);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.Message);
                }
            }
        }
    }

    private void Scanner_Status(object sender, Scanner.StatusEventArgs e)
    {
        var state = e.P0.State;
        if(state == StatusData.ScannerStates.Idle)
        {
            try
            {
                if (_scanner.IsEnabled &&
                    !_scanner.IsReadPending)
                {
                    SetScannerConfig();
                    _scanner.Read();
                }
            }
            catch (ScannerException e1)
            {
                Log.Error(e1.Message);
            }
        }
    }

    private void DeinitScanner()
    {
        if(_emdkManager != null)
        {
            if(_scanner != null)
            {
                try
                {
                    _scanner.CancelRead();
                    _scanner.Disable();
                    _scanner.Data -= Scanner_Data;
                    _scanner.Status -= Scanner_Status;

                    _scanner.Release();
                }
                catch (ScannerException e)
                {
                    Log.Error(e.Result.Description);
                }
            }
        }

        if (_barcodeManager != null)
        {
            _emdkManager.Release(EMDKManager.FEATURE_TYPE.Barcode);
        }

        _barcodeManager = null;
        _scanner        = null;
    }
    private void SetScannerConfig()
    {
        var config = _scanner.GetConfig();
        config.SkipOnUnsupported = ScannerConfig.SkipOnUnSupported.None;
        config.ScanParams.DecodeLEDFeedback = true;
        config.ReaderParams.ReaderSpecific.ImagerSpecific.PicklistEx = ScannerConfig.PicklistEx.Hardware;
        config.DecoderParams.Code39.Enabled = true;
        config.DecoderParams.Code128.Enabled = false;
        _scanner.SetConfig(config);
    }
    private void Scanner_Data(object sender, Scanner.DataEventArgs e)
    {
        var scanDataCollection = e.P0;
        if((scanDataCollection != null) && (scanDataCollection.Result == ScannerResults.Success))
        {
            var scanData = scanDataCollection.GetScanData();
            if (scanData[0].Data == null)
            {
                return;
            }

            RunOnUiThread(() => _scanBarcodeEditText.Text = scanData[0].Data);
            RunOnUiThread(ProcessScan);
        }
    }
    private void ProcessScan()
    {
        if (string.IsNullOrEmpty(_scanBarcodeEditText.Text))
        {
            Toast.MakeText(this, "You must scan or enter a barcode to begin", ToastLength.Long).Show();
            return;
        }
        else
        {
            var intent = new Intent(this, typeof(SecondActivity));
            intent.PutExtra("ScannedData",_scanBarcodeEditText.Text);
            StartActivity(intent)
        }
    }
}

Любые предложения будут с благодарностью.Как я уже говорил, в первый раз процесс работает просто отлично, когда я возвращаюсь к этому действию, сканер больше не инициализируется и не возвращается.

1 Ответ

0 голосов
/ 05 июня 2018

Я подозреваю, что EMDK не высвобождается должным образом до перезапуска действия.Если вы посмотрите на следующую статью , хотя при использовании Java принцип тот же, и есть совет выпустить EMDK в onStop ().См. Примечание об управлении экземпляром EMDK примерно на полпути вниз.

...