1.通过CMNET可以获得完全的Internet访问权,可以访问pop和imap等众多互联网服务;
2.通过CMWAP只能访问网页,无法访问pop和imap等众多互联网服务。
(1) 为什么会有两个接入点?
在国际上,通常只有一种GPRS接入方式,为什么在中国会有CMWAP和CMNET两兄弟呢?(彩信之所以单独配置接入点是因为彩信服务需要连接专用的服务器,在这里不作探讨。)
其实,CMWAP 和 CMNET 只是中国移动人为划分的两个GPRS接入方式。前者是为手机WAP上网而设立的,后者则主要是为PC、笔记本电脑、PDA等利用GPRS上网服务。它们在实现方式上并没有任何差别,但因为定位不同,所以和CMNET相比,CMWAP便有了部分限制,资费上也存在差别。
(2) 什么是WAP?
WAP只是一种GPRS应用模式,它与GRPS的接入方式是无关的。WAP应用采用的实现方式是“终端+WAP网关+WAP服务器”的模式,不同于一般Internet的“终端+服务器”的工作模式。主要的目的是通过WAP网关完成WAP-WEB的协议转换以达到节省网络流量和兼容现有WEB应用的目的。
WAP网关从技术的角度讲,只是一个提供代理服务的主机,它不一定由网络运营商提供。但据我所知,中国移动GPRS网络目前只有唯一的一个WAP网关:10.0.0.172,有中国移动提供,用于WAP浏览(HTTP)服务。有一点需要注意,WAP网关和一般意义上的局域网网关是有差别的,标准的WAP网关仅仅实现了HTTP代理的功能,并未完成路由、NAT等局域网网关的功能。这就决定了它在应用上所受到的限制。
为应用程序增加Http协议代理
- try {
- String proxyHost = android.net.Proxy.getDefaultHost();
- if (proxyHost != null) {//如果是wap方式,要加网关
- java.net.Proxy p = new java.net.Proxy(java.net.Proxy.Type.HTTP, new InetSocketAddress(
- android.net.Proxy.getDefaultHost(), android.net.Proxy.getDefaultPort()));
- conn = (HttpURLConnection) new URL(url).openConnection(p);
- } else {
- conn = (HttpURLConnection) new URL(url).openConnection();
- }
(3)无论是移动、联通还是电信,都至少提供了两种类型的的APN:WAP方式和NET方式。其中NET方式跟WIFI方式一样,无需任何设置,可自由访问所有类型网站,而WAP方式,需要手机先设置代理服务器和端口号等信息,并且只能访问HTTP协议类型的网站
移动和联通的WAP代理服务器都是10.0.0.172,端口号是80;而电信的WAP代理服务器是10.0.0.200,端口号是80。
Android系统中,对于APN网络的API是隐藏的,因此获取手机的APN设置,需要通过ContentProvider来进行数据库查询,查询的URI地址是:
取得全部的APN列表:content://telephony/carriers;
取得当前设置的APN:content://telephony/carriers/preferapn;
取得current=1的APN:content://telephony/carriers/current;
由于需要设置Proxy的情况为使用运营商网络,所以代码一开始即使用通过Context获得ConnectivityManager,执行ConnectivityManager.getActiveNetworkInfo()获取当前可用的网络。在有可用网络的情况下,判断其类型,如果networkInfo.getType()返回值为ConnectivityManager.TYPE_MOBILE,则需要设置Proxy;在返回值为ConnectivityManager.TYPE_WIFI的情况下则跳过设置Proxy的步骤。对HttpURLConnection设置Proxy需要指定代理IP及端口号,android.net.Proxy解决了这个问题。执行Proxy.getDefaultHost()和Proxy.getDefaultPort()将返回代理主机的IP及开放端口号,并以这两个信息传参构造InetSocketAddress。InetSocketAddress为IP套接地址,其主要形式可由IP地址与端口号组合而成,亦可用主机域名加端口号组合而成,这种情况下将尝试将主机域名解析为IP地址。
移动网络的判断:
- / 注意二:
- // 判断是否电信wap:
- //不要通过getExtraInfo获取接入点名称来判断类型,
- // 因为通过目前电信多种机型测试发现接入点名称大都为#777或者null,
- // 电信机器wap接入点中要比移动联通wap接入点多设置一个用户名和密码,
- // 所以可以通过这个进行判断!
- final Cursor c = mContext.getContentResolver().query(
- PREFERRED_APN_URI, null, null, null, null);
- if (c != null) {
- c.moveToFirst();
- final String user = c.getString(c
- .getColumnIndex("user"));
- if (!TextUtils.isEmpty(user)) {
- Log.i("",
- "=====================>代理:"
- + c.getString(c
- .getColumnIndex("proxy")));
- if (user.startsWith(CTWAP)) {
- Log.i("", "=====================>电信wap网络");
- return TYPE_CT_WAP;
- }
- }
- }
- c.close();
- // 注意三:
- // 判断是移动联通wap:
- // 其实还有一种方法通过getString(c.getColumnIndex("proxy")获取代理ip
- //来判断接入点,10.0.0.172就是移动联通wap,10.0.0.200就是电信wap,但在
- //实际开发中并不是所有机器都能获取到接入点代理信息,例如魅族M9 (2.2)等...
- // 所以采用getExtraInfo获取接入点名字进行判断
- String netMode = mobNetInfoActivity.getExtraInfo();
- Log.i("", "netMode ================== " + netMode);
- if (netMode != null) {
- // 通过apn名称判断是否是联通和移动wap
- netMode=netMode.toLowerCase();
- if (netMode.equals(CMWAP) || netMode.equals(WAP_3G)
- || netMode.equals(UNIWAP)) {
- Log.i("", "=====================>移动联通wap网络");
- return TYPE_CM_CU_WAP;
- }
- }
- }
参考:http://blog.csdn.net/shichaosong/article/details/8722823
http://www.jizhuomi.com/android/example/32.html
http://www.linuxidc.com/Linux/2012-08/67980.htm