代码之家  ›  专栏  ›  技术社区  ›  BigDevJames

Zebra Android扫描仪不会在活动中重新初始化

  •  0
  • BigDevJames  · 技术社区  · 7 年前

    我正在建造一个Xamarin。Zebra TC-70安卓设备的安卓应用程序。我的主要活动是让扫描仪第一次就可以正常运行。它从扫描仪中获取数据,然后将数据传递到另一个活动。如果取消新活动或完成工作并返回第一个活动,扫描仪不会重新初始化。这是我的代码:

    [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 回复  |  直到 7 年前
        1
  •  0
  •   Darryn Campbell    7 年前

    我怀疑在活动重新启动之前,EMDK没有被正确释放。如果你看看 following article ,尽管使用Java,原理是一样的,建议在onStop()中释放EMDK。请参阅关于管理EMDK实例的说明(大约一半)。