C# Zebra Android扫描仪不会在活动中重新初始化
我正在为Zebra TC-70 Android设备构建一个Xamarin.Android应用程序。我的主要活动是让扫描仪第一次就可以正常运行。它从扫描仪获取数据,然后将数据传递给另一个活动。如果取消新活动或完成工作并返回到第一个活动,扫描仪不会重新初始化。这是我的密码:C# Zebra Android扫描仪不会在活动中重新初始化,c#,android,xamarin,barcode-scanner,C#,Android,Xamarin,Barcode Scanner,我正在为Zebra TC-70 Android设备构建一个Xamarin.Android应用程序。我的主要活动是让扫描仪第一次就可以正常运行。它从扫描仪获取数据,然后将数据传递给另一个活动。如果取消新活动或完成工作并返回到第一个活动,扫描仪不会重新初始化。这是我的密码: [Activity(Label = "MyApp", MainLauncher = true, Icon = "@mipmap/icon", ScreenOrientation = ScreenOrienta
[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)
}
}
}
[活动(Label=“MyApp”,MainLauncher=true,Icon=“@mipmap/Icon”,
ScreenOrientation=ScreenOrientation.纵向)]
公共类MainActivity:AppCompatActivity,EMDKManager.IEMDKListener
{
//EMDK
私人条码管理人(条码管理人),;
私人EMDK经理(U EMDK经理);
私有编辑文本_scanBarcodeEditText;
专用扫描器(u扫描器),;
void EMDKManager.IEMDKListener.OnClosed()
{
如果(_emdkManager!=null)
{
_emdkManager.Release();
_emdkManager=null;
}
}
void EMDKManager.IEMDKListener.OnOpened(EMDKManager p0)
{
_emdkManager=p0;
InitScanner();
}
受保护的覆盖void OnResume()
{
base.OnResume();
var intent=新的intent(此,类型为(FpmsDataService));
BindService(intent,_dataServiceConnection,Bind.AutoCreate);
_scanBarcodeEditText.Text=string.Empty;
InitScanner();
}
受保护的覆盖void OnPause()
{
base.OnPause();
解除绑定服务(数据服务连接);
脱硝扫描器();
如果(_emdkManager!=null)
{
_emdkManager.Release();
_emdkManager=null;
}
}
受保护的覆盖无效OnDestroy()
{
base.ondestory();
脱硝扫描器();
如果(_emdkManager!=null)
{
_emdkManager.Release();
_emdkManager=null;
}
日志信息(“销毁的活动”);
Log.CloseAndFlush();
}
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
设置标志(WindowManagerFlags.KeepScreenOn、WindowManagerFlags.KeepScreenOn);
SetContentView(Resource.Layout.Main);
_scanBarcodeEditText=FindViewById(Resource.Id.MaintenanceScanBarcode_EditText);
//初始化扫描仪
var results=EMDKManager.GetEMDKManager(Application.Context,this);
}
私有void InitScanner()
{
如果(_emdkManager!=null)
{
如果(_barcodeManager==null)
{
尝试
{
//获取用于访问功能的功能对象,如BarcodeManager对象。
_barcodeManager=(barcodeManager)\u emdkManager.GetInstance(emdkManager.FEATURE\u TYPE.Barcode);
_scanner=\u barcodeManager.GetDevice(barcodeManager.DeviceIdentifier.Default);
如果(_scanner!=null)
{
//附加数据事件处理程序以获取数据回调。
_scanner.Data+=scanner\u数据;
_scanner.Status+=scanner\u状态;
_scanner.Enable();
}
其他的
{
日志错误(“未能启用扫描仪”);
}
}
捕获(扫描线例外)
{
日志错误(e.Message);
}
捕获(例外情况除外)
{
日志错误(例如消息);
}
}
}
}
私有无效扫描程序\u状态(对象发送器,Scanner.StatusEventArgs e)
{
var状态=e.P0.state;
if(state==StatusData.ScannerStates.Idle)
{
尝试
{
如果(_scanner.i启用&&
!\u扫描仪。IsReadPending)
{
SetScannerConfig();
_scanner.Read();
}
}
捕获(扫描头异常e1)
{
日志错误(e1消息);
}
}
}
私有void denitscanner()
{
如果(_emdkManager!=null)
{
如果(_scanner!=null)
{
尝试
{
_scanner.CancelRead();
_scanner.Disable();
_scanner.Data-=scanner\u数据;
_scanner.Status-=scanner\u状态;
_scanner.Release();
}
捕获(扫描线例外)
{
日志错误(如结果描述);
}
}
}
如果(_barcodeManager!=null)
{
_emdkManager.Release(emdkManager.FEATURE_TYPE.Barcode);
}
_barcodeManager=null;
_扫描器=空;
}
私有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);
}
专用无效扫描程序\u数据(对象发送器,Scanner.DataEventArgs e)
{
var ScandaCollection=e.P0;
if((ScandaCollection!=null)&&(ScandaCollection.Result==ScannerResults.Success))
{
var scanData=scandacollection.GetScanData();
if(扫描数据[0]。数据==null)
{
返回;
}
RunOnUiThread(()=>_scanBarcodeEditText.Text=scanData[0]。数据);
RunOnUiThread(ProcessScan);
}
}
私有无效P