从 Android 网络视图启动 QR 扫描仪并使用 Xamarin 返回扫描结果
Launching a QR scanner from Android web view and returning the scanned result using Xamarin
我有这个 Xamarin 应用程序,它在单击按钮时启动 QR 扫描仪。此按钮单击在 Javascript 中处理。单击按钮时,将调用下面的 C# 代码。这应该会启动 QR 扫描器,一旦值被扫描,扫描的值就会返回到 Javascript 函数。但是一旦点击扫描二维码的按钮,web view 应用程序就会进入后台,但相机不会启动扫描二维码。
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
}
下面是主要 activity 如何调用这个 class。
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");
以下是 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();
}
}
我在这里做错了什么?任何帮助将不胜感激。
以下是有效的解决方案。请注意扫描仪异步扫描更改。在将 Task 放入 js 文件之前,您需要等待结果。
资产scannerPage.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>
主要活动
public class MainActivity : Activity
{
WebView webView;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
MobileBarcodeScanner.Initialize(Application);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
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.LoadUrl("file:///android_asset/scannerPage.html");
}
扫描仪界面
public class QRScannerJSInterface : Java.Lang.Object
{
QRScanner qrScanner;
WebView webView;
public QRScannerJSInterface(WebView webView)
{
this.webView = webView;
qrScanner = new QRScanner();
}
[Export("ScanQR")]
public void ScanQR()
{
qrScanner.ScanQR()
.ContinueWith((t) =>
{
//var js = string.Format("getQRValue('{0}');", t.Result);
//webView.LoadUrl("javascript:" + js);
//call the Javascript method here with "result" as its parameter to get the scanned value
if (t.Status == TaskStatus.RanToCompletion)
webView.LoadUrl(@"javascript:getQRValue('" + t.Result + "')");
});
}
}
扫描仪class
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();
}
}
我有这个 Xamarin 应用程序,它在单击按钮时启动 QR 扫描仪。此按钮单击在 Javascript 中处理。单击按钮时,将调用下面的 C# 代码。这应该会启动 QR 扫描器,一旦值被扫描,扫描的值就会返回到 Javascript 函数。但是一旦点击扫描二维码的按钮,web view 应用程序就会进入后台,但相机不会启动扫描二维码。
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
}
下面是主要 activity 如何调用这个 class。
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");
以下是 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();
}
}
我在这里做错了什么?任何帮助将不胜感激。
以下是有效的解决方案。请注意扫描仪异步扫描更改。在将 Task 放入 js 文件之前,您需要等待结果。
资产scannerPage.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>
主要活动
public class MainActivity : Activity
{
WebView webView;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
MobileBarcodeScanner.Initialize(Application);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
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.LoadUrl("file:///android_asset/scannerPage.html");
}
扫描仪界面
public class QRScannerJSInterface : Java.Lang.Object
{
QRScanner qrScanner;
WebView webView;
public QRScannerJSInterface(WebView webView)
{
this.webView = webView;
qrScanner = new QRScanner();
}
[Export("ScanQR")]
public void ScanQR()
{
qrScanner.ScanQR()
.ContinueWith((t) =>
{
//var js = string.Format("getQRValue('{0}');", t.Result);
//webView.LoadUrl("javascript:" + js);
//call the Javascript method here with "result" as its parameter to get the scanned value
if (t.Status == TaskStatus.RanToCompletion)
webView.LoadUrl(@"javascript:getQRValue('" + t.Result + "')");
});
}
}
扫描仪class
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();
}
}