Inject javascript into WebChromeClient
我知道,您可以将javascript注入Android WebView。我已经做到了。但是,我加载了html5 / javascript网络应用程序(不是我自己的,因此无法访问代码),并且需要注入其他javascript。但是,此Web应用程序无法在标准WebView中正常工作。其原因可能是:
"By default, a WebView provides no browser-like widgets, does not enable JavaScript and web page errors are ignored."
http://developer.android.com/reference/android/webkit/WebView.html
因此,我启用了Javascript,但这可能是由于它忽略了网页错误。但是,在普通的Chrome浏览器中,一切正常,没有任何问题。
尽管我已经启用了很多功能,但Webview无法正常工作:
1 2 3 4 5 6 7 8 | webView = (WebView) findViewById( R.id.webView ); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setPluginState(PluginState.ON); webView.getSettings().setDomStorageEnabled(true); webView.setBackgroundColor(0x00000000); webView.setWebChromeClient( new WebChromeClient() ); webView.setWebViewClient( new WebViewListener() ); CookieManager.getInstance().setAcceptCookie(true); |
因此,是否有可能将javascript注入普通的WebChromeClient?
还是您还有其他猜测,我还可以启用或注入到Webview中吗?
首先,您需要使用从WebViewClient派生的类来设置WebViewClient:
1 2 3 | WebView webview = new WebView(); webview.setWebViewClient(new WebClient()); webview.loadUrl("stackoverflow.com"); |
然后在WebClient中,等待页面加载(onPageFinished)。然后,您加载loadUrl(" javascript:[此处是您的javascript]")。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class WebClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { // Obvious next step is: document.forms[0].submit() view.loadUrl("javascript:document.forms[0].q.value='[android]'"); } } |
记得要执行与JavaScript相关的不同任务,因此需要启用一堆选项甚至设置浏览器类型...以下是这些配置选项:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | webView.setWebChromeClient(webChromeClient); webView.setWebViewClient(new InsideWebViewClient(getBaseContext(), webView)); WebSettings settings = webView.getSettings(); settings.setAllowUniversalAccessFromFileURLs(true); settings.setBuiltInZoomControls(false); settings.setUseWideViewPort(true); settings.setJavaScriptEnabled(true); settings.setSupportMultipleWindows(true); settings.setJavaScriptCanOpenWindowsAutomatically(true); settings.setLoadsImagesAutomatically(true); settings.setDomStorageEnabled(true); settings.setLoadWithOverviewMode(true); settings.setMediaPlaybackRequiresUserGesture(false); // Call private class InsideWebViewClient settings.setPluginState(WebSettings.PluginState.ON); settings.setAllowFileAccess(true); // settings.setUserAgentString("Mozilla/5.0"); settings.setUserAgentString("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36"); // webView.setInitialScale(50); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (0 != (getApplicationContext().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE)) { webView.setWebContentsDebuggingEnabled(true); } } |
以供参考,该参考与以下基本相同:
https://github.com/cprcrack/VideoEnabledWebView/blob/01c7f758a409fabbc501cdf24efdf5b77400280f/app/src/main/java/name/cpr/ExampleActivity.java