在 WebView Android 中扫描条形码
Scan Barcode Within WebView Android
我正在尝试在用户按下 html 中的按钮时启动条形码扫描仪。但是我收到一个错误:
Uncaught TypeError: Object [object Object] has no method 'scanBarcode'", source: file:///android_asset/www/index.html (49)
在javascript中调用:
function scanner(){
Android.scanBarcode();
}
现在在 Java 文件中,我有以下代码,它声明了public class JavaScriptInterface
中的函数
这是我MainActivity.java
文件:
public class MainActivity extends Activity {
@SuppressWarnings("deprecation")
@SuppressLint("SetJavaScriptEnabled") @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
WebView myWebView = (WebView)findViewById(R.id.webView);
myWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
myWebView.setInitialScale(1);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setBuiltInZoomControls(false);
webSettings.setSupportZoom(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setUseWideViewPort(true);
//webView.getSettings().setJavaScriptEnabled(true);
myWebView.setWebChromeClient(new WebChromeClient());
//myWebView.setWebViewClient(new WebViewClient());
myWebView.loadUrl("file:///android_asset/www/index.html");
}
public class JavaScriptInterface {
Context mContext;
// Instantiate the interface and set the context
JavaScriptInterface(Context c) {
mContext = c;
}
// using Javascript to call the finish activity
public void closeMyActivity() {
finish();
}
public void scanBarcode() {
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
startActivityForResult(intent, 0);
}
} //JavascriptInterface
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
//here is where you get your result
String barcode = intent.getStringExtra("SCAN_RESULT");
}
}
}
现在这是我在网上找到的代码示例,对我来说一切看起来都很好,我最初唯一要做的就是导入所有必要的库,并将barcode
变量定义为字符串类型。
任何帮助将不胜感激。或者也许是从Web视图访问条形码扫描仪功能的不同方法。
...
myWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
...
public class JavaScriptInterface {
您已经调用了接口类 JavaScriptInterface,但创建了一个新的 WebAppInterface 以传递给 WebView。
编辑
上面的答案仍然成立:你永远不会用你的WebView注册接口(JavaScriptInterface(,所以你无权访问这些方法(scanBarcode(。
由于 WebView 中实际上需要两个接口,因此需要添加这两个接口
myWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
myWebView.addJavascriptInterface(new JavaScriptInterface(this), "Scanner");
在你的javascript中,你将有两个对象Android
和Scanner
,它们对应于这两个接口。Android将具有WebAppInterface中定义的所有方法,而Scanner将具有JavaScriptInterface中定义的方法。你的 JavaScript 函数变成了
function scanner() {
Scanner.scanBarcode();
}
编辑 2
如果您的目标是 sdk 版本 17 或更高版本,则还必须注释要在 javascript 中使用的方法
public class JavaScriptInterface {
...
@JavascriptInterface
public void scanBarcode() {
...
}
}
奖励:一些不请自来的建议,使用更好的名称。如果 WebAppInterface 提供了与应用程序数据交互的方法,请将其称为 DataInterface(即使这可能太通用了,但我不知道您的应用程序使用哪种数据(。由于 JavaScriptInterface 启动扫描程序并关闭应用程序,也许你可以称之为 ActionInterface。将它们作为"AppData"和"AppActions"传递给您的WebView,为您提供了AppData.getCategories()
和AppActions.closeMyActivity()
等更合乎逻辑的功能。
- c#web应用程序中的条形码打印
- Datalogic Falcon X3-条形码扫描仪
- 显示使用jquery mobile扫描数据角色=页面上的条形码
- 使用方法将扫描的项目添加到总数中
- 如何处理从条形码扫描仪返回的二进制数据
- 用Javascript重新扫描图像
- 如何阻止Netbeans扫描某个文件夹
- phonegap angularjs条形码扫描仪
- 使用webqr和getusermedia脚本扫描二维码
- Phonegap条形码扫描仪:无法'我不能让它跑
- 如果端口范围太宽,节点中的端口扫描不起作用
- 如何仅扫描特定文本框中的条形码
- 在 WebView Android 中扫描条形码
- 扫描条形码时发出 JQuery 警报
- 将带有ASCII控制字符的条形码扫描到输入字段中
- 使用Angular js HTML5进行条形码和Qrcode扫描
- 从web应用程序中的任何网页捕获扫描的条形码
- 避免在通过条形码扫描仪扫描后自动提交表单
- 条形码扫描在智能手机/平板电脑浏览器的web应用程序
- 自动提交表单后扫描条形码使用桥式扫描