C# 从Android web view启动QR扫描仪并使用Xamarin返回扫描结果

C# 从Android web view启动QR扫描仪并使用Xamarin返回扫描结果,c#,android,xamarin,android-webview,zxing,C#,Android,Xamarin,Android Webview,Zxing,我有一个Xamarin应用程序,当点击按钮时启动QR扫描仪。此按钮单击在Javascript中处理。当点击按钮时,下面的C代码被调用。这将启动QR扫描仪,扫描完值后,扫描的值将返回给Javascript函数。但只要点击扫描二维码的按钮,网络视图应用程序就会进入后台,但不会启动摄像头扫描二维码 public class QRScannerJSInterface : Java.Lang.Object { QRScanner qrScanner; WebVie

我有一个Xamarin应用程序,当点击按钮时启动QR扫描仪。此按钮单击在Javascript中处理。当点击按钮时,下面的C代码被调用。这将启动QR扫描仪,扫描完值后,扫描的值将返回给Javascript函数。但只要点击扫描二维码的按钮,网络视图应用程序就会进入后台,但不会启动摄像头扫描二维码

 public class QRScannerJSInterface : Java.Lang.Object
    {
        QRScanner qrScanner;
        WebView webView;

        public QRScannerJSInterface(WebView webView)
        {
            this.webView = webView;
            qrScanner = new QRScanner();
        }

        [Export]
        [JavascriptInterface]
        public void ScanQR()
        {
            String result = qrScanner.ScanQR();
            var js = string.Format("getQRValue('{0}');", result);
            webView.LoadUrl("javascript:" + js);
            //call the Javascript method here with "result" as its parameter to get the scanned value
        }
下面是主活动如何调用该类

        webView = FindViewById<WebView>(Resource.Id.webView);
        webView.Settings.JavaScriptEnabled = true;
        webView.Settings.AllowFileAccessFromFileURLs = true;
        webView.Settings.AllowUniversalAccessFromFileURLs = true;
        webView.Settings.AllowFileAccess = true;
        webView.AddJavascriptInterface(new QRScannerJSInterface(webView),"CSharpQRInterface");
webView=findviewbyd(Resource.Id.webView);
webView.Settings.JavaScriptEnabled=true;
webView.Settings.AllowFileAccessFromFileURLs=true;
webView.Settings.allowuniversalaccessfromfileurl=true;
webView.Settings.AllowFileAccess=true;
AddJavascriptInterface(新的QRScannerJSInterface(webView),“CSharpQRInterface”);
下面是QRScanner代码

class QRScanner
    {
        MobileBarcodeScanner scanner;

        public QRScanner()
        {
            scanner = new MobileBarcodeScanner();
        }

        public String ScanQR()
        {
            scanner.UseCustomOverlay = false;
            scanner.TopText = "Scanning for barcode";
            Task<ZXing.Result> result = scanner.Scan();
            return result.ToString();
        }
    }
类QRS扫描仪
{
手机条码扫描仪;
公共QRScanner()
{
scanner=新的MobileBarcodeScanner();
}
公共字符串ScanQR()
{
scanner.UseCustomOverlay=false;
scanner.TopText=“扫描条形码”;
任务结果=scanner.Scan();
返回result.ToString();
}
}

我做错了什么?任何帮助都将不胜感激。

以下是有效的解决方案。请注意扫描仪异步扫描更改。在将任务放入js文件之前,需要等待结果

资产扫描页面.html

<html>
<head>
    <title></title>

    <script type='text/javascript'>

        function getQRValue(result) {
    };

        function scan() {
            CSharpQRInterface.ScanQR();
        };


    </script>

</head>
<body style="background-color:powderblue;">
    <button type="button" onclick="scan()">Click Me!</button>
</body>
</html>
扫描器类

class QRScanner
    {
        MobileBarcodeScanner scanner;

        public QRScanner()
        {
            scanner = new MobileBarcodeScanner();
        }

        public async Task<string> ScanQR()
        {
            scanner.UseCustomOverlay = false;
            scanner.TopText = "Scanning for barcode";
            var result = await scanner.Scan();
            return result.ToString();
        }
    }
类QRS扫描仪
{
手机条码扫描仪;
公共QRScanner()
{
scanner=新的MobileBarcodeScanner();
}
公共异步任务ScanQR()
{
scanner.UseCustomOverlay=false;
scanner.TopText=“扫描条形码”;
var result=wait scanner.Scan();
返回result.ToString();
}
}

以下是有效的解决方案。请注意扫描仪异步扫描更改。在将任务放入js文件之前,需要等待结果

资产扫描页面.html

<html>
<head>
    <title></title>

    <script type='text/javascript'>

        function getQRValue(result) {
    };

        function scan() {
            CSharpQRInterface.ScanQR();
        };


    </script>

</head>
<body style="background-color:powderblue;">
    <button type="button" onclick="scan()">Click Me!</button>
</body>
</html>
扫描器类

class QRScanner
    {
        MobileBarcodeScanner scanner;

        public QRScanner()
        {
            scanner = new MobileBarcodeScanner();
        }

        public async Task<string> ScanQR()
        {
            scanner.UseCustomOverlay = false;
            scanner.TopText = "Scanning for barcode";
            var result = await scanner.Scan();
            return result.ToString();
        }
    }
类QRS扫描仪
{
手机条码扫描仪;
公共QRScanner()
{
scanner=新的MobileBarcodeScanner();
}
公共异步任务ScanQR()
{
scanner.UseCustomOverlay=false;
scanner.TopText=“扫描条形码”;
var result=wait scanner.Scan();
返回result.ToString();
}
}

有什么原因不能使用ZXing.NET或类似的本机组件吗?QRScanner类正在包装ZXing.NET组件。我已经在编辑的文档中添加了该代码question@Cheesebaron当我在本机android应用程序中运行它时,该代码可以工作。当我在web视图中运行它时,就会发生这种情况。有什么原因不能使用ZXing.NET或类似的本机组件吗?QRScanner类正在包装ZXing.NET组件。我已经在编辑的文档中添加了该代码question@Cheesebaron当我在本机android应用程序中运行它时,该代码可以工作。当我在web视图中运行它时,除了没有调用qrScanner.ScanQR().ContinueWith((t)=>我做了什么不同的事情?你的工作!我没有你的html,也没有调试你的代码,所以我不能确切地说是什么错了。除了异步调用扫描之外,我删除了不必要的属性[JavascriptInterface]除了不调用qrScanner.ScanQR().ContinueWith((t)=>我做了什么不同?你的工作!我没有你的html,也没有调试你的代码,所以我不能确切地告诉你出了什么问题。除了异步调用scan外,我删除了不必要的属性[JavascriptInterface]并将函数名称添加到属性[Export(“ScanQR”)]