引入jar包到libs下
1.添加网络权限
2.判断网页地址是否为空
3.不为空的情况下创建客户端对象
4.处理get/post请求
5.如果成功的话,设置显示内容的值
a) 获取文件响应编码类型(保证不乱码)
i. 遍历头部信息取出contentType_value的值
ii. 定义服务器缺省编码方式
iii. 处理contentType_value来获取编码方式
1. contentType_value是否有“=”
2. contentType_value是否为空
b) 根据服务端返回的编码给显示内容设置值
通EditText获取索要查看的网页地址,当点击查看按钮,在屏幕 显示网页源代码
运行结果:
1.在AndroidManifest.xml添加internet权限
<uses-permission android:name="android.permission.INTERNET"/>
2.布局文件 activity_main.xml
在这次布局中,为了方便源代码显示,我们在textview控件外包了ScrollView滚动条控件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <EditText android:id="@+id/et_url" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="http://www.baidu.com" android:inputType="textUri"> </EditText> <Button android:id="@+id/btn_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/et_url" android:layout_below="@+id/et_url" android:layout_marginLeft="34dp" android:text="显示网页元源代码" android:onClick="sendHttpUil" /> <ScrollView android:id="@+id/scrollView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/btn_send" > <TextView android:id="@+id/tv_info" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="显示内容信息" /> </ScrollView> </RelativeLayout>
3.MainActivity.java 代码中有详细注释,请认真观看
package com.example.android_htmlcode; import java.io.UnsupportedEncodingException; import org.apache.http.Header; import android.app.Activity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; public class MainActivity extends Activity { private EditText et_url; private TextView tv_url; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 设置显示视图 setContentView(R.layout.activity_main); et_url = (EditText) findViewById(R.id.et_url); tv_url = (TextView) findViewById(R.id.tv_info); } // android:onClick="sendHttpUil public void sendHttpUil(View v) { int id = v.getId(); switch (id) { case R.id.btn_send: String url = et_url.getText().toString(); // 判断网页地址是否为空 if (TextUtils.isEmpty(url)) { Toast.makeText(this, "网页地址不能为空", 0).show(); } else { // 创建客户端对象 AsyncHttpClient client = new AsyncHttpClient(); // 处理get/post请求 client.get(url, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { super.onSuccess(statusCode, headers, responseBody); // 获取文件响应类型 String contentType_value = null; // 遍历头部信息 for (Header header : headers) { // 获取contentType_value的头部信息 if (header.getName().equals("Content-Type")) { // 获取他的value值 contentType_value = header.getValue(); } } // 定义服务器端缺省的编码方式 String default_charset = "UTF-8"; // 处理contentType_value来获取编码方式 // 判断是否为null if (contentType_value != null) { // 判断是否有=字符 if (contentType_value.contains("=")) { // 获取=字符位置 int index = contentType_value.indexOf("="); // 从=所在位置的下一个字符开始截取,返回服务器端的编码 default_charset = contentType_value.substring( index + 1, contentType_value.length()); } else { String result = new String(responseBody); default_charset = getCharSet(result); } } else { String result = new String(responseBody); default_charset = getCharSet(result); } Toast.makeText(MainActivity.this, "编码是:" + default_charset, 0).show(); if (statusCode == 200) { try { tv_url.setText(new String(responseBody, default_charset)); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 获取网页源代码中默认的编码 * * @param result * @return */ public String getCharSet(String result) { String defaultCharset = null; // <mate http-equiv="Content-Type" // content="text/html; charset=GBK" /> //html4 // <mate charset="UTF-8"> if (result != null) { if (result .contains("content=\"text/html; charset=GBK\"")) { defaultCharset = "GBK"; } else if (result .contains("content=\"text/html; charset=UTF-8\"")) { defaultCharset = "UTF-8"; } else if (result .contains("content=\"text/html; charset=GB2312\"")) { defaultCharset = "GB2312"; } else if (result.contains("charset=\"UTF-8\"")) { defaultCharset = "UTF-8"; } else if (result.contains("charset=\"UTF-8\"")) { defaultCharset = "GBK"; } } return defaultCharset; } }); } break; default: break; } } }
一、案例中我们以百度为例,百度编码为utf-8,输出结果为上述结果,若网页编码为GBK,输出结果又该为什么呢?
我们自己编写一个服务端采用gbk方式,程序如下:
自己创建的服务器端,通过浏览器查看响应头是gbk
运行结果如下:
二、html4和html5相应的区别:
当头信息content-type没有任何信息的时候,我们需要查看响应来获取我们所需要的编码。这也就是html5和html4的区别。我们需要根据<meta>信息进行解析。
原因 :在activity中没有设置视图
解决办法:在oncreate中通过setContentView方法设置显示视图
@Override protected void onCreate(Bundle savedInstanceState) { <span style="white-space:pre"> </span>super.onCreate(savedInstanceState); <span style="white-space:pre"> </span>//设置显示视图 <span style="white-space:pre"> </span>setContentView(R.layout.activity_main); }
控制台输出错误信息如下:
修改方法://android:onClick="sendHttpUil
private void sendHttpUil(View v) {}
改为
public void sendHttpUil(View v) {}
开源框架资源:http://download.csdn.net/detail/zhaoyazhi2129/7400787
源码:http://download.csdn.net/detail/zhaoyazhi2129/7400805
转发请标明原文地址;http://blog.csdn.net/zhaoyazhi2129/article/details/27050805