【问题标题】:Scan Barcode Within WebView Android在 WebView Android 中扫描条码
【发布时间】:2014-12-17 12:09:45
【问题描述】:

我正在尝试在用户按下 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 变量定义为字符串类型。

任何帮助将不胜感激。或者可能是从网络视图访问条形码扫描仪功能的不同方法..

【问题讨论】:

    标签: java javascript android zxing barcode-scanner


    【解决方案1】:
    ...
        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 中,您将有两个对象 AndroidScanner 对应于这两个接口。 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() 这样的函数,它们更符合逻辑。

    【讨论】:

    • 是的,然后我有一个名为WebAppInterface.java 的文件听说我有许多从我的javascript 调用的函数,例如Android.showCategories() 这是我必须调用我的条形码扫描函数的地方吗?不在MainActivity 中,这是有道理的,但是一些默认函数没有定义。例如startActivityForResult(intent, 0); 和常量RESULT_OK 对此有何建议?
    • 我将之前的代码移动到正确的文件中,并按照我的问题底部的描述进行了修复。我现在有一个不同的问题,所以我编辑了我的问题以显示这一点。
    • 您可以定义多个接口,但您需要将它们全部单独添加并赋予它们唯一的名称。查看我的编辑
    • @jburley89 这并不是 Stackoverflow 的工作原理。如果您有新问题,请发布新问题。
    • 好的,感谢您当时的编辑 :) 如您所述,我已尝试添加新的 Scanner,但收到 Cannot instantiate the type JavascriptInterface 错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多