Android WebView获取网页返回值码

9271人阅读
Android(43)
有时候我们可能需要做一些模拟操作,比如爬虫,一般我们会直接采用HTTP请求实现扒取网页内容,不过,我们可以使用WebView来实现。
WebView初始化,我们为其设置参数,为其设置嵌入JavaScript代码的Java对象。
this.getSettings().setJavaScriptEnabled(true);
this.addJavascriptInterface(new InJavaScriptLocalObj(), "java_obj");
this.setWebViewClient(new CustomWebViewClient());
在CustomWebViewClient中,当访问的http请求加载完成的时候,加载JavaScript代码,在JavaScript代码中调用我们之前嵌入的java对象。
final class CustomWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
public void onPageFinished(WebView view, String url) {
view.loadUrl("javascript:window.java_obj.getSource('&head&'+" +
"document.getElementsByTagName('html')[0].innerHTML+'&/head&');");
super.onPageFinished(view, url);
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
再来看这个嵌入的Java对象
* 逻辑处理
final class InJavaScriptLocalObj {
@JavascriptInterface
public void getSource(String html) {
Log.d("html=", html);
这样流程完成,然后再调用loadUrl()访问我们想要抓取html代码的网页链接。
关于@JavascriptInterface
上面实现了通过WebView获取html代码的流程,不过在上面定义的类我们可能发现了嵌入的Java对象类的方法添加了标注@JavascriptInterface,为什么要这样做呢?
我们可以点击addJavascriptInterface()方法的源码查看,发现,居然有这么多的注释:
* Injects the supplied Java object into this WebView. The object is
* injected into the JavaScript context of the main frame, using the
* supplied name. This allows the Java object's methods to be
* accessed from JavaScript. For applications targeted to API
* level {@link android.os.Build.VERSION_CODES
* and above, only public methods that are annotated with
* {@link android.webkit.JavascriptInterface} can be accessed from JavaScript.
* For applications targeted to API level {@link android.os.Build.VERSION_CODES
* all public methods (including the inherited ones) can be accessed, see the
* important security note below for implications.
* &p& Note that injected objects will not
* appear in JavaScript until the page is next (re)loaded. For example:
* class JsObject {
{@literal @}JavascriptInterface
public String toString() { return "injectedObject"; }
* webView.addJavascriptInterface(new JsObject(), "injectedObject");
* webView.loadData("&!DOCTYPE html&&title&&/title&", "text/html", null);
* webView.loadUrl("javascript:alert(injectedObject.toString())");&/pre&
* &strong&IMPORTANT:&/strong&
* &li& This method can be used to allow JavaScript to control the host
* application. This is a powerful feature, but also presents a security
* risk for apps targeting {@link android.os.Build.VERSION_CODES
* Apps that target a version later than {@link android.os.Build.VERSION_CODES
* are still vulnerable if the app runs on a device running Android earlier than 4.2.
* The most secure way to use this method is to target {@link android.os.Build.VERSION_CODES
* and to ensure the method is called only when running on Android 4.2 or later.
* With these older versions, JavaScript could use reflection to access an
* injected object's public fields. Use of this method in a WebView
* containing untrusted content could allow an attacker to manipulate the
* host application in unintended ways, executing Java code with the
* permissions of the host application. Use extreme care when using this
* method in a WebView which could contain untrusted content.&/li&
* &li& JavaScript interacts with Java object on a private, background
* thread of this WebView. Care is therefore required to maintain thread
* &li& The Java object's fields are not accessible.&/li&
* &li& For applications targeted to API level {@link android.os.Build.VERSION_CODES
* and above, methods of injected Java objects are enumerable from
* JavaScript.&/li&
* @param object the Java object to inject into this WebView's JavaScript
context. Null values are ignored.
* @param name the name used to expose the object in JavaScript
public void addJavascriptInterface(Object object, String name) {
checkThread();
mProvider.addJavascriptInterface(object, name);
代码注释说明,该方法为WebView注入Java对象,允许JavaScript去调用Java对象。当TargetApi为17或者以上,Java对象中只有标注了{@link android.webkit.JavascriptInterface}的公共方法能够被JavaScript调用。当TargetApi为JELLY_BEAN(api16)或者以下,Java对象所有的公共方法都能被JavaScript调用。
注意的安全事项:
1)这个方法能被用于允许JavaScript去控制主应用程序。这是一个强大的功能,而且也造成了{@link android.os.Build.VERSION_CODES#JELLY_BEAN}或更早版本的安全风险。TargetApi大于等17的时候也会有风险,因为应用有可能运行于4.2之前的设备。最安全可靠的方法是设置TargetApi为JELLY_BEAN_MR1或以上,同时确保该方法只有在运行于4.2以及以上版本的设备时才被调用。而在这些老版本中,JavaScript可以通过反射访问注入对象的公共变量,这样的方法会导致一些恶意攻击者去操纵我们的主机,因此,当我们的WebView访问一些可能不被信任的内容的时候,需要非常小心。
2)JavaScript和Java对象的交互运行在WebView内部的后台线程,
3)注入的Java对象的全局变量是不可访问的。
4)注意,直到WebView再次load的时候,注入的Java对象才会出现在JavaScript代码中。因此,我们需要在http请求加载完成之后,再加载我们自己写的JavaScript代码,如下:
class JsObject {
{@literal @}JavascriptInterface
public String toString() { return "injectedObject"; }
webView.addJavascriptInterface(new JsObject(), "injectedObject");
webView.loadData("&!DOCTYPE html&&&", "text/html", null);
webView.loadUrl("javascript:alert(injectedObject.toString())");
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:59514次
积分:1073
积分:1073
排名:千里之外
原创:40篇
评论:57条
(2)(1)(1)(1)(2)(3)(1)(1)(1)(1)(2)(6)(6)(4)(1)(2)(3)(2)(1)(2)(2)(2)android webview获取html代码和根据id获取value_HTML教程-织梦者
当前位置:&>&&>& > android webview获取html代码和根据id获取value
android webview获取html代码和根据id获取value
最近做一个项目,需要webview获取网页中input的内容,把知识整理一下,做个记录,也希望对大家有所帮助。
2 获取html内容
2.1 初始化webview
webview.getSettings().setJavaScriptEnabled(true);
webview.addInterface(new InJavaScriptLocalObj(), "java_obj");
*注意,@JavascriptInterface方法的注解是一定要加的,
*很多同学因为没加所以没有效果
final class InJavaScriptLocalObj {
@JavascriptInterface
public void getSource(String html) {
Log.d("html=", html);
2.2 获取html代码
view.loadUrl("javascript:window.java_obj.getSource('&head&'+" +
"document.getElementsByTagName('html')[0].innerHTML+'&/head&');");
当执行这句话的时候,会回调InJavaScriptLocalObj 中的getSource方法。
3 根据id获取value
可能会有这样一个需求:在网页的文本框中输入内容后,要在android中获取文本框的输入内容。那么这个文本框需要设置一个id,我们用javascript代码来获取value。代码如下:
3.1 初始化webview
这一块的代码和上面是一样的
webview.getSettings().setJavaScriptEnabled(true);
webview.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");
public final class InJavaScriptLocalObj {
private String value = "";
public String getValue(){
return this.
@JavascriptInterface
public void getValueById(String value) {
Log.d("HTML", value);
this.value =
3.2 根据id获取value
detail_web.loadUrl("javascript:window.local_obj.getValueById(document.getElementById('acount_comment').value);");
好了就讲到这里吧,希望对大家有所帮助。
以上就是android webview获取html代码和根据id获取value的全文介绍,希望对您学习和使用html网页基础有所帮助.
这些内容可能对你也有帮助
更多可查看HTML教程列表页。
猜您也会喜欢这些文章android webview中使用Java调用JavaScript方法并获取返回值
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了android webview中使用Java调用JavaScript方法并获取返回值,本文直接给出代码示例,需要的朋友可以参考下
在android平板上用webview打开一个网页,调用里面的javascript方法,同时相互传参。
网上例子很少啊,基本都不能获取返回值,贴一个自己最后调试完的代码如下:
protected void onCreate(Bundle savedInstanceState)
x = (WebView)this.findViewById(R.id.webView_viewTable);
x.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
x.getSettings().setBuiltInZoomControls(true);
x.getSettings().setJavaScriptEnabled(true);
x.addJavascriptInterface(new JsToJava(), "stub");& //JsToJava是内部类,代码在后面。stub是接口名字。
//x.loadUrl("http://192.168.1.1/init.html");//这句是载入一个html页面。但是因为直接load一个网页会有延迟,所以最好用下面这句:
x.loadDataWithBaseURL("", data, "text/html", "UTF-8","");& //这句里面data是init.html的内容。就是代码。直接用FileInputStream获取到就好。
x.loadUrl("javascript:setValuesJson('hello world')"); //hello world是给JavaScript传递的参数。setValuesJson是页面里JavaScript的方法。如果传递的参数中有双引号的话,用下面的写法:
String url = "javascript:setValuesJson(\"" + jsonString + "\")";
x.loadUrl(url);
}//onCreate结束
再写一个内部类:
private class JsToJava
&&&&&&& public void jsMethod(String paramFromJS)
&&&&&&&&&&& //Log.i("CDH", paramFromJS);
&&&&&&&&&&& System.out.println("js返回结果" + paramFromJS);//处理返回的结果
JavaScript代码:
&script type="text/javascript"&
&&&&&&& function setValuesJson(param)
&&&&&&&&&&& alert(param);//param是java传过来的值,即"hello world".
&&&&&&&&&&& var result = "传回Java的string";
&&&&&&&&&&& window.stub.jsMethod(result);//用接口stub, 通过调用内部类中的方法jsMethod给java传回result。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 网页中返回顶部代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信