2016-12-03 51 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

相關問題