2016-12-03 50 views
0

我需要阅读位于网站上的按钮上的文本。我试图用JSOUP解析页面,但JSOUP没有看到Javascript对象。这就是为什么我决定使用WebView来阅读文本。但它不起作用。我需要将按钮文本从Javascript返回到Java。可能吗?使用WebView将按钮文本从Javascript返回到Java

public class MainActivity extends AppCompatActivity { 

    WebView mWebView; 
    Button mButton, mClick; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mWebView = (WebView) findViewById(R.id.web_view); 
     mButton = (Button) findViewById(R.id.start_URL); 
     mClick = (Button) findViewById(R.id.click); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mWebView.getSettings().setJavaScriptEnabled(true); 
       mWebView.getSettings().setUseWideViewPort(true); 
       mWebView.getSettings().setLoadWithOverviewMode(true); 
       mWebView.getSettings().setDomStorageEnabled(true); 
       mWebView.setWebViewClient(new PersonalWebView()); 
       mWebView.setWebChromeClient(new PersonalWebChrome()); 
       mWebView.addJavascriptInterface(new JSInterface(), "JSInterface"); 
       mWebView.loadUrl(URL); 

      mClick.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
       mWebView.loadUrl("javascript: window.JSInterface.callFromJS('buttonText')");} 
    } 

    private class JavaScriptInterface { 

     @JavascriptInterface 
     public void callFromJS(String buttonText) { 
      Log.d("JScript","callFromJS "+ buttonText); 
     } 
    } 

    private class PersonalWebView extends WebViewClient{ 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return true; 
     } 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
     } 
     @Override 
     public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { 
      super.onReceivedError(view, request, error); 
     } 
    } 


    private class PersonalWebChrome extends WebChromeClient { 

     private PersonalWebChrome() { 
      super(); 
     } 

     @Override 
     public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
      return super.onJsAlert(view, url, message, result); 
     } 
    }  
     @Override                     
    public boolean onConsoleMessage(ConsoleMessage consoleMessage) { 
     Log.d("TAG", consoleMessage.message()+" "+consoleMessage.sourceId()); 
     return super.onConsoleMessage(consoleMessage); 
    } 
} 

我试图改变的代码,但它不工作:

mClick.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mWebView.addJavascriptInterface(new JSInterface(), "JSInterface"); 
       ValueCallback<String> result = new ValueCallback<String>() { 
        @Override 
        public void onReceiveValue(String value) { 
         Log.d("TAG", value); 
        } 
       };              
    mWebView.evaluateJavascript("javascript: window.JSInterface.callFromJS('buttonText')",result);}}  

在日志我看到:

D/TAG: Uncaught TypeError: Cannot read property 'callFromJS' of undefined

+0

我删除了mButton onnClick mWebView.loadUrl(URL)和它的工作。 Сorrected例子。 – Delphian

回答

1

这是处理注入正确的Java对象的方式:

mWebView.addJavascriptInterface(new JavaScriptInterface(), "javaCallback"); 
mWebView.loadUrl("javascript:window.javaCallback.callFromJS('buttonText')"; 

注入的对象只能成为“看得见”的下一页加载,致电addJavascriptInterface。加载javascript: URIs不计入页面加载。

退房the sample from the docs

webView.addJavascriptInterface(new JsObject(), "injectedObject"); 
webView.loadData("", "text/html", null); 
webView.loadUrl("javascript:alert(injectedObject.toString())"); 

之间的loadData是实际使要插入的对象。你也可以使用loadUrl,但它需要是一个真实的页面(来自网络,资产,about:blank,不管),但不是一个javascript:的URI。

+0

米哈伊尔,谢谢!它很棒!我改变了我的例子。 – Delphian

0

问题应该在试图调用callFromJS方法在注册界面之前。您只需点击按钮注册JS接口:

mClick.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mWebView.addJavascriptInterface(new JSInterface(), "JSInterface"); 
      } 
} 

但你尝试立即拨打callFromJS

而不是做这个的,请将您的mWebView.evaluateJavascript("javascript: window.JSInterface.callFromJS('buttonText')",result);onClick()

+0

谢谢,EvaluateJavascript方法位于onClick()内。我错过了大括号。 – Delphian

相关问题