将javascript注入WebChromeClient

4
我知道,你可以将javascript注入到Android WebView中。我已经做到了。然而,我加载了一个html5/javascript网络应用程序(不是我的,所以我无法访问代码),我需要注入其他的javascript。但是这个网络应用程序在标准的WebView中不能正常工作。这可能是因为:

"默认情况下,WebView不提供类似浏览器的小部件,不启用JavaScript并且忽略网页错误。"
http://developer.android.com/reference/android/webkit/WebView.html

所以,我启用了Javascript,但也许是因为它忽略了网页错误。然而,在普通的Chrome浏览器中,一切都没有问题。

WebView不起作用,尽管我已经启用了很多东西:

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中启用或注入什么东西呢?


你需要解释一下它具体是怎么出问题的。 - kabuko
请参见 https://dev59.com/lGw15IYBdhLWcg3wpNcB#6475858 - rogerdpack
这可能有所帮助,不知道你怎么看:https://github.com/cprcrack/VideoEnabledWebView - CrandellWS
2个回答

3
首先,您需要使用从WebViewClient派生的类设置setWebViewClient:
WebView webview = new WebView();
webview.setWebViewClient(new WebClient());
webview.loadUrl("stackoverflow.com");

在WebClient中,您需要等待页面加载完成(onPageFinished)。然后,您可以使用loadUrl("javascript:[您的JavaScript代码]")来加载JavaScript代码。

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]'");       
    }
}

2
谢谢。如果您查看上面的代码,您会发现我已经完全这样做了。但是,它不起作用,因为Webview不是一个完全兼容的浏览器。同时我的问题是:“将JavaScript注入WebChromeClient”,而不是WebViewClient。也许您应该先阅读我的问题。因此得分-1。 - toom

0

我记得想要完成不同的JavaScript相关任务,因此需要启用一堆选项甚至设置浏览器类型...这些配置选项如下:

        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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接