Android 是否可以在onCreateWindow创建的WebView上调用addJavascriptInterface?
我有一个简单的浏览器应用程序,我的onCreateWindow如下所示: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
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时会出现问题。