ZXing可以停止或处理,以便我可以再次使用它吗?

时间:2016-12-29 15:20:54

标签: xamarin zxing dispose

我正在使用ZXing.Net.Mobile这样的表格

ng-repeat

来自https://components.xamarin.com/gettingstarted/zxing.net.mobile.forms

但是当我扫描一次后,当我再次尝试时,卡梅拉被冻结了 我试图处理/停止扫描仪但没有成功

ZXing可以停止或处置,以便我可以再次使用它吗?

即时通讯使用visual studio 2015社区,xamarin.Forms 2.3.3.168,Syncfusion 14.4.0.15和ZXing.Net.Mobile 2.1.47。在Android版6.0.1和使用API​​ 23的sony xperia z3上运行它

非常感谢任何帮助

4 个答案:

答案 0 :(得分:5)

找到解决方案......

  

仅使用IsScanning = true一次...在ScannerView构造函数或页面的OnAppearing中。

_zxing = new ZXingScannerView
    {
        VerticalOptions = LayoutOptions.Center,
        HorizontalOptions = LayoutOptions.Center,
        HeightRequest = 250,
        WidthRequest = 250,
        IsAnalyzing = true,
        IsScanning = true,

    };
  

不要在OnDisappearing中写任何东西......

protected override void OnDisappearing()
{
   // _zxing.IsScanning = false;
    base.OnDisappearing();

}

一旦扫描完成,IsAnalysing设置为false,并且应在OnAppearing中设置为true ...

_zxing.OnScanResult += (result) =>       
Device.BeginInvokeOnMainThread(async () =>
{
     if (!string.IsNullOrWhiteSpace(result.Text))
     {
         _zxing.IsAnalyzing = false;
         await OnGettingResult(result.Text);
     }
});

protected override void OnAppearing()
{
    base.OnAppearing();
    _zxing.IsAnalyzing = true;

   //Not required if already set while intialization
   //_zxing.IsScanning = true;

}

答案 1 :(得分:0)

为什么不将它与异步一起使用?完成扫描后,它会将我返回到导航堆栈中。看起来您使用的是通用扫描仪页面,因此以下解决方案可行。

var scanner = new ZXing.Mobile.MobileBarcodeScanner();

var result = await scanner.Scan();

if (result != null)
{
    variableToAssign = result.Text;
}

答案 2 :(得分:0)

如果像我一样,您希望扫描仪在一次扫描后不关闭电源,或者只扫描一次相同的代码,那么您要检查是否已经扫描了特定的二维码。

var options = new MobileBarcodeScanningOptions();
var scans = new HashSet<string>();

options.PossibleFormats.Add(ZXing.BarcodeFormat.QR_CODE);
ZXingScannerPage scanPage = new ZXingScannerPage(options);
scanPage.Title = "Scan QR Code";

scanPage.OnScanResult += (result) =>
{
    //Only scan a particular QR code once
    if (!scans.Contains(result.Text))
    {
        scans.Add(result.Text);

        //etc
    }
}

答案 3 :(得分:0)

有一种变通办法应该在页面开头和您将要取消订阅的操作开始时起作用

scanPage.OnScanResult-= YourAction();

结束后,您应该再次订阅进行扫描

scanPage.OnScanResult + = YourAction();