如何让ZxingScanner开始扫描?
how to make ZxingScanner start scanning?
我正在尝试在我的 Xamarin 表单中实施条形码扫描,但没有成功。
我可以让摄像头正常工作,但我没有在屏幕上看到红线,它只是拒绝扫描任何东西
我试过了。我可以通过我的相机看到,但没有出现红线。但是我可以打开和关闭手电筒
XAML代码:
<Button BackgroundColor="Chocolate" Clicked="Button_Clicked"/>
<zxing:ZXingScannerView
x:Name="_scanView"
OnScanResult="Handle_OnScanResult"
IsScanning="true"
IsAnalyzing="true"
WidthRequest="200"
HeightRequest="200" />
C#代码:
private void Button_Clicked(object sender, EventArgs e)
{
_scanView.ToggleTorch();
}
private void Handle_OnScanResult(ZXing.Result result)
{
ChassisEntry.Text = result.Text;
}
// this is in the constructor of the page
MobileBarcodeScanningOptions options = new ZXing.Mobile.MobileBarcodeScanningOptions()
{
TryHarder = true,
PossibleFormats = new List<ZXing.BarcodeFormat>() { ZXing.BarcodeFormat.All_1D }
};
_scanView.Options = options;
我错过了什么?
编辑
我的 MainActivity.cs
里有这个
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
ZXing.Net.Mobile.Forms.Android.Platform.Init();
LoadApplication(new App());
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
ZXing.Net.Mobile.Forms.Android.PermissionsHandler.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
答案补充
@Rafeal 的回答对我有用,唯一的问题是扫描视图上没有红线。
我找到这个 workaround
来解决那个问题。
但是,这是一种解决方法,因为我注意到如果条形码位于视图中的任何位置,扫描就会发生。
虽然这似乎不是问题,但就我而言,我的纸质表格上有多达 20 个条形码,当用户想要瞄准特定条形码时,他可能会弄错。
因此,如果有人知道更好的解决方案,我想听听。
关于这个问题,我将在 SO 上单独提问。
这是我现在使用的解决方法
<Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
<zxing:ZXingScannerView
x:Name="_scanView"
OnScanResult="Handle_OnScanResult"
IsScanning="true"
WidthRequest="200"
HeightRequest="200"/>
<zxing:ZXingDefaultOverlay
x:Name="scannerOverlay"
BottomText="Place the red line over the barcode you'd like to scan.">
</zxing:ZXingDefaultOverlay>
</Grid>
在我的工作项目中,我使用了这个 xaml 声明:
<zxing:ZXingScannerView x:Name="qrCodeScannerView"
OnScanResult="Handle_OnScanResult"
IsScanning="true"
WidthRequest="1024"
HeightRequest="400" />
请注意,我没有像您那样在 xaml 声明中设置 isAnalyzing
属性。当页面出现时,zxing 控件立即开始工作和分析。
然后在xaml.cs
文件
public void Handle_OnScanResult(Result scanResult)
{
qrCodeScannerView.IsScanning = false;
// processing scanResult.Text here
}
protected override void OnAppearing()
{
base.OnAppearing();
qrCodeScannerView.IsScanning = true;
}
protected override void OnDisappearing()
{
base.OnDisappearing();
qrCodeScannerView.IsScanning = false;
}
这看起来很奇怪,但是在 xaml.cs 文件中设置 isScanning
属性 也为我解决了这个任务。
尝试从 XAML 中完全删除 ZXingScannerView。在按钮的单击事件中添加此代码:
private async void ButtonScan(object sender, EventArgs e)
{
PermissionStatus granted = await Permissions.CheckStatusAsync<Permissions.Camera>();
if (granted != PermissionStatus.Granted)
{
_ = await Permissions.RequestAsync<Permissions.Camera>();
}
if (granted == PermissionStatus.Granted)
{
try
{
MobileBarcodeScanner scanner = new MobileBarcodeScanner();
ZXing.Result result = await scanner.Scan();
if (result != null && result.Text != "")
{
//You access your scanned text with result.Text
scanner.Cancel(); // <--- This closes the scanner
}
}
catch (Exception)
{
await DisplayAlert("Problem", "Something went wrong.", "ΟΚ");
}
}
else
{
await DisplayAlert("Problem", "No permissions to use camera.", "ΟΚ");
}
}
编辑
OP 提到我应该将这行代码添加到我的答案中以使其工作。
在 MainActivity.cs 中,您必须像这样初始化扫描仪:
ZXing.Mobile.MobileBarcodeScanner.Initialize(Application);
我正在尝试在我的 Xamarin 表单中实施条形码扫描,但没有成功。
我可以让摄像头正常工作,但我没有在屏幕上看到红线,它只是拒绝扫描任何东西
我试过了
XAML代码:
<Button BackgroundColor="Chocolate" Clicked="Button_Clicked"/>
<zxing:ZXingScannerView
x:Name="_scanView"
OnScanResult="Handle_OnScanResult"
IsScanning="true"
IsAnalyzing="true"
WidthRequest="200"
HeightRequest="200" />
C#代码:
private void Button_Clicked(object sender, EventArgs e)
{
_scanView.ToggleTorch();
}
private void Handle_OnScanResult(ZXing.Result result)
{
ChassisEntry.Text = result.Text;
}
// this is in the constructor of the page
MobileBarcodeScanningOptions options = new ZXing.Mobile.MobileBarcodeScanningOptions()
{
TryHarder = true,
PossibleFormats = new List<ZXing.BarcodeFormat>() { ZXing.BarcodeFormat.All_1D }
};
_scanView.Options = options;
我错过了什么?
编辑
我的 MainActivity.cs
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
ZXing.Net.Mobile.Forms.Android.Platform.Init();
LoadApplication(new App());
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
ZXing.Net.Mobile.Forms.Android.PermissionsHandler.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
答案补充
@Rafeal 的回答对我有用,唯一的问题是扫描视图上没有红线。
我找到这个 workaround
来解决那个问题。
但是,这是一种解决方法,因为我注意到如果条形码位于视图中的任何位置,扫描就会发生。
虽然这似乎不是问题,但就我而言,我的纸质表格上有多达 20 个条形码,当用户想要瞄准特定条形码时,他可能会弄错。
因此,如果有人知道更好的解决方案,我想听听。
关于这个问题,我将在 SO 上单独提问。
这是我现在使用的解决方法
<Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
<zxing:ZXingScannerView
x:Name="_scanView"
OnScanResult="Handle_OnScanResult"
IsScanning="true"
WidthRequest="200"
HeightRequest="200"/>
<zxing:ZXingDefaultOverlay
x:Name="scannerOverlay"
BottomText="Place the red line over the barcode you'd like to scan.">
</zxing:ZXingDefaultOverlay>
</Grid>
在我的工作项目中,我使用了这个 xaml 声明:
<zxing:ZXingScannerView x:Name="qrCodeScannerView"
OnScanResult="Handle_OnScanResult"
IsScanning="true"
WidthRequest="1024"
HeightRequest="400" />
请注意,我没有像您那样在 xaml 声明中设置 isAnalyzing
属性。当页面出现时,zxing 控件立即开始工作和分析。
然后在xaml.cs
文件
public void Handle_OnScanResult(Result scanResult)
{
qrCodeScannerView.IsScanning = false;
// processing scanResult.Text here
}
protected override void OnAppearing()
{
base.OnAppearing();
qrCodeScannerView.IsScanning = true;
}
protected override void OnDisappearing()
{
base.OnDisappearing();
qrCodeScannerView.IsScanning = false;
}
这看起来很奇怪,但是在 xaml.cs 文件中设置 isScanning
属性 也为我解决了这个任务。
尝试从 XAML 中完全删除 ZXingScannerView。在按钮的单击事件中添加此代码:
private async void ButtonScan(object sender, EventArgs e)
{
PermissionStatus granted = await Permissions.CheckStatusAsync<Permissions.Camera>();
if (granted != PermissionStatus.Granted)
{
_ = await Permissions.RequestAsync<Permissions.Camera>();
}
if (granted == PermissionStatus.Granted)
{
try
{
MobileBarcodeScanner scanner = new MobileBarcodeScanner();
ZXing.Result result = await scanner.Scan();
if (result != null && result.Text != "")
{
//You access your scanned text with result.Text
scanner.Cancel(); // <--- This closes the scanner
}
}
catch (Exception)
{
await DisplayAlert("Problem", "Something went wrong.", "ΟΚ");
}
}
else
{
await DisplayAlert("Problem", "No permissions to use camera.", "ΟΚ");
}
}
编辑
OP 提到我应该将这行代码添加到我的答案中以使其工作。
在 MainActivity.cs 中,您必须像这样初始化扫描仪:
ZXing.Mobile.MobileBarcodeScanner.Initialize(Application);