【问题标题】:calling java function from javascript on android从android上的javascript调用java函数
【发布时间】:2014-08-03 23:56:13
【问题描述】:

我正在尝试在 android 应用程序中建立 javascript 和 java 之间的连接,并且我能够以一种方式控制 javascript,它用 111111 填充“gsm_num”字段,然后用 222222 填充,但它不能调用函数“jsmessage”在java中...我尝试在整个点击功能之前移动@SuppressLint(“JavascriptInterface”),但它无法打印js消息... 有人可以告诉我我做错了什么吗?

@Override
        public void onClick(View arg0) {

            String url = "http://www.page.com";
            wv.loadUrl(url);
            setContentView(wv);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setWebViewClient(new WebViewClient() {

                public void onPageFinished(WebView view1, String url) {

                    view1.getSettings().setJavaScriptEnabled(true);
                    view1.loadUrl("javascript: document.getElementById('gsm_num').value = '11111111'; document.forms['button'].submit();");

                    view1.setWebViewClient(new WebViewClient() {
                        @SuppressLint("JavascriptInterface")
                        @JavascriptInterface
                        public void onPageFinished(WebView view2, String url) {

                            final class JavaScriptInterface {
                                JavaScriptInterface () { }
                                public void jsmessage() {
                                    Log.e("btijs", "message");
                                }
                              }


                            view2.getSettings().setJavaScriptEnabled(true);

                            view2.addJavascriptInterface(new JavaScriptInterface(), "JSInterface");
                            view1.loadUrl("javascript: document.getElementById('gsm_num2').value = '2222222'; window.JSInterface.jsmessage();");


                         }

                    });
                }
            });
        }
    });

【问题讨论】:

    标签: java javascript android interface bridge


    【解决方案1】:

    我认为这里有几个问题。首先,我认为您需要像这样向您的WebView 添加一个新的JavaScriptInterface

        wv.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
    

    而且我认为您的 JavaScript 代码本身可能无法正常工作。你实际上并没有将你的输入声明为一个函数。这是我用来执行类似任务的一些代码:

        wv.loadUrl("javascript:(function() { " +
                            "window.HTMLOUT.showHTML(document.getElementById('role').innerHTML);" +
                            "})()");
    

    其中showHTML 是我在JavaScriptInterface 中编写的方法

    这是我使用它的方法中的JavaScriptInterface 类:

    private void Authentication(){
    
        class MyJavaScriptInterface {
    
            @JavascriptInterface
            public void showHTML(String content) {
                // grants access based on authorization level
    
                }
            }
        }
    
        // open up the login page
        final WebView wv = (WebView)findViewById(R.id.login_webview);
    
        wv.getSettings().setJavaScriptEnabled(true);
    
        wv.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
    
        wv.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
    
                //once page is finished loading, check id="role" pass that value to showHTML
                if(url.contains(getString(R.string.loginURL))) {
                    wv.loadUrl("javascript:(function() { " +
                            "window.HTMLOUT.showHTML(document.getElementById('role').innerHTML);" +
                            "})()");
    
                }
    
            }
    
            @Override
            public void onReceivedError(WebView view, int errorCode, String description,
                                        String failingUrl) {
                Log.w("LoginActivity: ", description);
            }
        });
    
        wv.loadUrl(getString(R.string.loginURL));
    
    }
    

    【讨论】:

    • 感谢您的回复...您能告诉我您是如何编写 MyJavaScriptInterface()...现在我让 js 运行 javascript 接口但我无法将任何值传递给 java...实际上它在 java 中运行代码,不管我在 js 中写什么......这太奇怪了,但我运行了这段代码 boldif( document.getElementById('container').innerHTML.indexOf('xxx') != -1) { document.getElementById('gsm_num').value = '1111111'; };**大胆的** 。在 js 中,它仍然从 java 向 logcat 打印消息,并将 gsm_num 值设置为 111111
    • 太棒了...谢谢伙计...我按照您的示例做了...我的问题是我在 onPageFinished 中声明了 javascript 接口...它需要添加到开始上课...
    猜你喜欢
    • 2012-05-10
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多