如果知道了一个网页的URL,在Android中用Java代码获得这个网页的Html内容其实很容易了,直接用HttpClient进行Http请求就行了,虽然简单,这里还是贴一下代码,一个很简单的例子:
import ......;
public class ThirdActivity extends Activity {
private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
doGetConnect();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("click to get html");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message); //启动线程
}
}
);
setContentView(button);
}
private String doGetConnect(){
String result = "";
InputStream is = null;
HttpGet httpRequest=new HttpGet("http://192.168.1.154:7087/index.html");
try {
HttpResponse httpResponse=new DefaultHttpClient().execute(httpRequest);
if(httpResponse.getStatusLine().getStatusCode()==200){ //正确
is = httpResponse.getEntity().getContent();
byte[] data = new byte[1024];
int n = -1;
ByteArrayBuffer buf = new ByteArrayBuffer(10*1024);
while ((n = is.read(data)) != -1)
buf.append(data, 0, n);
result= new String(buf.toByteArray(), HTTP.UTF_8);
Log.v("result==", result);
is.close();
return result;
}
else {Log.v("tip==", "error response code");}
} catch (Exception e) {
Log.e("error==", ""+e.getMessage());
}
return null;
}
}
但是如果想在用webView加载网页时,就能获得网页的Html代码就没那么容易了,SDK并没有提供相关的方法调用。这里用到在webView中进行Java代码和JavaScript代码互掉的方法,用JavaScript获得网页的Html代码很容易吧,然后把提取的html代码传递给Java代码,显示出来就可以了。
首先来看看webView中调用JavaScript以及反过来JavaScript调用Java方法的一般方式,这里还是做了一个小例子,还包括相互传参数的方式。Android代码如下:
public class FourthActivity extends Activity {
WebView mWebView;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mWebView = new WebView(this);
setContentView(mWebView);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JavaScriptInterface(), "aliasInHtml");
mWebView.loadUrl("file:///android_asset/my.html"); //加载assets目录下的本地html文件
}
class JavaScriptInterface{
//public void getHTML(String html){
// Log.v("html==", html);
//}
public void startDo(final String parameter){
mHandler.post(new Runnable(){ //启动线程
public void run() {
mWebView.loadUrl("javascript:fillContent('"+parameter+"')");//调用javascript代码,这里是调用了
//JavaScript方法,并传递了一个参数
// mWebView.loadUrl("javascript:window.aliasInHtml.getHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
}
});
}
}
}
而放在Android工程的assets目录下的my.html代码如下:
<html>
<script language="javascript">
function fillContent(p){
document.getElementById("content").innerHTML = 'hello:' + p;
}
</script>
<body>
<a onClick="window.aliasInHtml.startDo('dlut');">call method defined in java code</a>
<!-- 调用Java类的方法 -->
<p id="content"></p>
<p>Tomorrow is another day!!</p>
</body>
</html>
好了,在上面的基础上,如何获得html的代码呢,首先,在JavaScriptInterface类中添加一个方法,供JavaScript调用,从而显示Html内容(即上面代码注释掉的内容):
public void getHTML(String html){
Log.v("html==", html);
}
而首先在 JavaScript中获得Html中代码,然后调用上面的getHtml方法显示出来,写法为:
mWebView.loadUrl("javascript:window.aliasInHtml.getHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
当然,触发获得Html的事件完全可以通过其他方式,这里就是点击网页上的连接,比如可以在那个Activity里添加一个Button,点击Button获得网页的内容。