C# 从Android web view启动QR扫描仪并使用Xamarin返回扫描结果
我有一个Xamarin应用程序,当点击按钮时启动QR扫描仪。此按钮单击在Javascript中处理。当点击按钮时,下面的C代码被调用。这将启动QR扫描仪,扫描完值后,扫描的值将返回给Javascript函数。但只要点击扫描二维码的按钮,网络视图应用程序就会进入后台,但不会启动摄像头扫描二维码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
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”)]