Android 是否可以在onCreateWindow创建的WebView上调用addJavascriptInterface?

Android 是否可以在onCreateWindow创建的WebView上调用addJavascriptInterface?,android,android-webview,chromium,webviewclient,Android,Android Webview,Chromium,Webviewclient,我有一个简单的浏览器应用程序,我的onCreateWindow如下所示: if (userGesture) { WebView childView = new WebView(webBrowserActivity); WebSettings settings = childView.getSettings(); settings.setJavaScriptEnabled(true); settings

我有一个简单的浏览器应用程序,我的onCreateWindow如下所示:

if (userGesture) {
            WebView childView = new WebView(webBrowserActivity);
            WebSettings settings = childView.getSettings();
            settings.setJavaScriptEnabled(true);
            settings.setSupportZoom(true);
            settings.setJavaScriptCanOpenWindowsAutomatically(true);
            settings.setBuiltInZoomControls(true);
            settings.setSupportMultipleWindows(true);
            settings.setLoadWithOverviewMode(true);
            settings.setUseWideViewPort(true);
            childView.addJavascriptInterface(new MyInterface(),"NAME");
            <--- code in here to add the view to a ViewPager.
            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(childView);
            resultMsg.sendToTarget();
            Log.v(TAG, "Opening popup for " + childView.getUrl());
            webBrowserActivity.invalidateOptionsMenu();
            return true;
        } else {
            return false;
        }
我尝试过在稍后添加这个接口,我也尝试过在页面加载后调用reload或loadUrl,因为文档中说必须在加载页面之前添加javascript接口。所有这些都没有帮助。有人成功地做到了吗

谢谢

编辑:我应该提到我在4.4上看到了更多,我正在使用Chrome的桌面调试器,我可以进入控制台,在第一个webview上看到window.NAME对象,而不是在第二个webview上。在4.3中,它似乎经常起作用


我编辑了上面的代码以显示我正在使用的设置。当添加到活动开始时创建的第一个WebView时,我正在添加到WebView的javascript界面工作正常。

是。它应该会起作用。我希望你做到了:

mWebView.getSettings().setJavaScriptEnabled(true);

对。它应该会起作用。我希望你做到了:

mWebView.getSettings().setJavaScriptEnabled(true);

不幸的是,KitKat WebView中存在一个bug,使得无法在弹出窗口上注册JavaScript接口。对于这个问题没有已知的解决方法,恐怕除了你建议的,保留弹出窗口的URL,从onCreateWindow返回false,然后创建一个全新的webview,并将弹出URL加载到其中。

不幸的是,KitKat webview中存在一个错误,使得无法在弹出窗口上注册JavaScript接口。恐怕这个问题没有已知的解决方法,除非您建议,否则请保留弹出窗口的URL,从onCreateWindow返回false,然后创建一个全新的webview并将弹出URL加载到其中。

该方法有一个安全警告:

仅适用于API级别JELLY_BEAN_MR1及以上的应用程序 可以使用JavascriptInterface注释公共方法 从JavaScript访问

因此,如果您真的需要它,您的代码应该如下所示:

@JavascriptInterface
public void yourJavaFunction() 
{
    //do you stuff
}
请注意,这样做会使您面临安全风险,如中所述。

该方法具有安全警告:

仅适用于API级别JELLY_BEAN_MR1及以上的应用程序 可以使用JavascriptInterface注释公共方法 从JavaScript访问

因此,如果您真的需要它,您的代码应该如下所示:

@JavascriptInterface
public void yourJavaFunction() 
{
    //do you stuff
}

请注意,如果这样做,您将面临安全风险,正如。

中所述,在onCreateWindow创建的webview之后使用JS也会遇到同样的问题。 在挖掘资料之后,我觉得这是不可能的

final WebView.WebViewTransport transport = (WebView.WebViewTransport) msg.obj;
if(transport!=null){
    transport.setWebView(mCustomWebView);
}
msg.sendToTarget();
在我们向目标发送消息后,执行此操作

然后,它读到

似乎由于安全原因,onCreateWindow阻止在webview上添加JS

评论说

/** *此方法将提供的Java对象注入ContentViewCore。 *对象被注入到主框架的JavaScript上下文中, *使用提供的名称。这允许从中访问Java对象 *JavaScript。请注意,注入的对象不会显示在中 *直到下一次重新加载页面。例如: * *重要: * *addJavascriptInterface可用于允许JavaScript控制 *主机应用程序。这是一个强大的功能,但也提供了一个 *安全风险。在包含以下内容的ContentViewCore中使用此方法 *不受信任的内容可能允许攻击者操纵主机 *以非预期的方式运行应用程序,使用权限执行Java代码 *主机应用程序的。在紧急情况下使用此方法时要格外小心 *ContentViewCore可能包含不受信任的内容。特别注意 *应避免无意中访问继承的方法,例如 *作为{@link ObjectgetClass}。要防止访问继承的方法, *传递{@code requiredAnnotation}的批注。这将确保 *只有具有{@code requiredAnnotation}的方法才会向 *Javascript层。{@code requiredAnnotation}将传递给所有 *如果任何方法返回对象,则随后注入Java对象。这 *意味着同样的限制或缺乏限制将适用。或者, *可以调用{@link addJavascriptInterfaceObject,String},其中 *自动使用{@link JavascriptInterface}注释。 *JavaScript在私有的后台与Java对象交互 *ContentViewCore的线程。因此,需要小心维护 *线程安全。 *

这是一个进退两难的局面。您可以通过从CreateWindow创建的webview中获取url并使用该url创建新的webview来使用JS。我试过了,当链接是简单的超链接时,它就起作用了。但是,用这种方式,一些页面,特别是用javascript打开的页面,将无法正常工作

到目前为止,我得到了这个,我的时间很短。
请有人分享更多。谢谢。

在onCreateWindow创建的webview之后使用JS也有同样的问题。 在挖掘资料之后,我觉得这是不可能的

final WebView.WebViewTransport transport = (WebView.WebViewTransport) msg.obj;
if(transport!=null){
    transport.setWebView(mCustomWebView);
}
msg.sendToTarget();
在我们向目标发送消息后,执行此操作

然后,它读到

似乎由于安全原因,onCreateWindow阻止在webview上添加JS

评论说

/** *此方法将提供的Java对象注入ContentViewCore。 *对象被注入到主框架的JavaScript上下文中, *使用提供的名称。这允许从中访问Java对象 *JavaScript。请注意,注入的对象不会显示在中 *直到下一次重新加载页面。例如: * *重要: * *addJavascriptInterface可用于允许JavaScript控制 *主机应用程序。这是一个强大的功能,但也提供了一个 *安全风险。在包含以下内容的ContentViewCore中使用此方法 *不受信任的内容可能允许攻击者操纵主机 *以非预期的方式运行应用程序,使用权限执行Java代码 *主机应用程序的。在紧急情况下使用此方法时要格外小心 *ContentViewCore可能包含不受信任的内容。特别注意 *应避免无意中访问继承的方法,例如 *作为{@link ObjectgetClass}。要防止访问继承的方法, *传递{@code requiredAnnotation}的批注。这将确保 *只有具有{@code requiredAnnotation}的方法才会向 *Javascript层。{@code requiredAnnotation}将传递给所有 *如果任何方法返回对象,则随后注入Java对象。这 *意味着同样的限制或缺乏限制将适用。或者, *可以调用{@link addJavascriptInterfaceObject,String},其中 *自动使用{@link JavascriptInterface}注释。 *JavaScript在私有的后台与Java对象交互 *ContentViewCore的线程。因此,需要小心维护 *线程安全。 *

这是一个进退两难的局面。您可以通过从CreateWindow创建的webview中获取url并使用该url创建新的webview来使用JS。我试过了,当链接是简单的超链接时,它就起作用了。但是,用这种方式,一些页面,特别是用javascript打开的页面,将无法正常工作


到目前为止,我得到了这个,我的时间很短。请有人分享更多。谢谢。

您使用的是哪一版本的Android?在4.4上,我确信这就是正在发生的事情,因为我可以连接桌面Chrome来调试移动浏览器。在4.3上,我也遇到了同样的问题,但只是在一些弹出窗口上,但由于我无法轻松调试,我不知道那里到底发生了什么。我只是在4.3上玩了一段时间,它似乎总是在那里工作,新的4.4更改肯定有问题。您能保留对子视图的引用并在返回结果后添加javascript吗?我认为sendToTarget将异步运行,因此在之后立即运行可能不够。我尝试过这样做,我尝试过刷新页面并读取界面,加载新url,无论我尝试了什么,如果使用onCreateWindow创建WebView,它都无法工作。我确实有一个令人讨厌的解决办法,我创建了一个新的网络视图并使用了相同的url,效果很好。你使用的是哪一版本的Android?在4.4上,我肯定会发生这种情况,因为我可以连接桌面Chrome来调试移动浏览器。在4.3上,我也遇到了同样的问题,但只是在一些弹出窗口上,但由于我无法轻松调试,我不知道那里到底发生了什么。我只是在4.3上玩了一段时间,它似乎总是在那里工作,新的4.4更改肯定有问题。您能保留对子视图的引用并在返回结果后添加javascript吗?我认为sendToTarget将异步运行,因此在之后立即运行可能不够。我尝试过这样做,我尝试过刷新页面并读取界面,加载新url,无论我尝试了什么,如果使用onCreateWindow创建WebView,它都无法工作。我确实有一个讨厌的解决方法,我创建了一个新的网络视图,并使用相同的url,这很好。是的,我正在这样做,很抱歉我在写文章时忘记复制那段代码。我还应该在第一个WebView中提到我对此没有任何问题。是的,我正在这样做,很抱歉我在发表文章时忘记复制那段代码。我还应该提到,我在第一个WebView中对此没有任何问题。这不是一个bug,有一个解决方法。看我的,这不是一个bug,还有一个解决方法。看到我为投了没有用的一票而感到抱歉。我对@JavascriptInterface表示法也有同样的问题。顾客
由活动或片段创建的om webview与JS配合良好。当onCreateWindow创建webview时出现了一个问题。很抱歉投了无效的一票。我对@JavascriptInterface表示法也有同样的问题。由活动或片段创建的自定义webview与JS配合良好。当onCreateWindow创建webview时会出现问题。