Android WAP NET 区别
参考: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
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;
- }
- }
- }
===============================================================================
最后总结一点:手机接入点分为
①WIFI
②Moblie:WAP、NET
在做项目的过程中,如果有网络访问,需要判断网络类型,如果是WAP,则需要设置代理IP和端口,如果是其他类型则不用设置,具体设置方法也可以参考下面工具类。
=======================================================================================
第一部分:
public class NetUtil {
//当前正在处于连接的APN信息
private static Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");
/**
* 通过判断wifi和mobile两种方式是否能够连接网络
*/
public static boolean checkNetWork(Context context) {
boolean isWIFI = isWIFI(context);
boolean isMobile = isMobile(context);
// 如果两个渠道都无法使用,提示用户设置网络信息
if (isWIFI == false && isMobile == false) {
return false;
}
// 判断APN列表中哪个渠道
if(isMobile)
{
// 读取当前处于连接状态的的Apn的配置信息:ip和端口
readAPN(context);//联系人信息的读取基本一致
}
return true;
}
/**
* 读取当前处于连接状态的的Apn的配置信息:ip和端口
* @param context
*/
private static void readAPN(Context context) {
ContentResolver contentResolver = context.getContentResolver();
Cursor query = contentResolver.query(PREFERRED_APN_URI, null, null, null, null);
if(query!=null&&query.moveToFirst())
{
//读取ip和prot
GloableParams.PROXY_IP=query.getString(query.getColumnIndex("proxy"));
GloableParams.PROXY_PORT=query.getInt(query.getColumnIndex("port"));
}
}
/**
* 判断是否WIFI处于连接状态
*
* @return
*/
public static boolean isWIFI(Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (networkInfo != null) {
return networkInfo.isConnected();
}
return false;
}
/**
* 判断是否APN列表中某个渠道处于连接状态
*
* @return
*/
public static boolean isMobile(Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (networkInfo != null) {
return networkInfo.isConnected();
}
return false;
}
}
第二部分:
/**
* 通用的连接工具(wap)
*
* @author Administrator
*
*/
public class HttpClientUtil {
private HttpRequest request;
private HttpGet get;
private HttpPost post;
private HttpResponse response;
private HttpClient client;
public HttpClientUtil() {
client = new DefaultHttpClient();
// 判断是否读取到了ip信息(代理)
if (StringUtils.isNotBlank(GloableParams.PROXY_IP)) {
// wap方式上网
HttpHost host = new HttpHost(GloableParams.PROXY_IP, GloableParams.PROXY_PORT);
client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, host);
}
}
}
================================================================================
Android WAP NET 区别相关推荐
- android:layout_gravity 和 android:gravity 的区别
gravity 这个英文单词是重心的意思,在这里就表示停靠位置的意思. android:layout_gravity 和 android:gravity 的区别 从名字上可以看到,android:gr ...
- android:windowBackground 和 android:background 的区别
通过问别人,我知道了android:windowBackground 和 android:background的区别 android:windowBackground 一般用于activity启动的时 ...
- ImageView---属性android:background与android:src的区别
ImageView中XML属性android:src和android:background的区别: android:background会根据ImageView组件给定的长宽进行拉伸.android: ...
- sdk数值与android版本,Android SdkVersion的区别及获取版本信息方法
1.minSdkVersion,targetSdkVersion,maxSdkVersion,compileSdkVersion四个数值之间有什么区别? • minSdkVersion,maxSdkV ...
- android L和android M的区别
android L与android M的区别主要还是应该关注M对L的改进.Android M相比Android Lollipop(5.0)有六项重大的改进: 1.App Permissions(软件权 ...
- Android:layout_width和Android:width的区别
前言:今天看属性动画时发现当我们对一个Button按钮做动画时是没有效果的(解决办法),代码如下: private void performAnimate(){ObjectAnimator.ofInt ...
- android:padding和android:margin的区别
转载请说明博客地址:http://blog.csdn.net/qq_32059827/article/details/51487997 看了网上的类似博客,并没有给出确定的区别.现在具体分析一下pad ...
- 相同点安卓和iosui的相同点_学UI设计必要分清iOS和Android的设计区别
原标题:学UI设计必要分清iOS和Android的设计区别 不同平台的设计和开发感觉像是在不同的国家之间旅行.你要做同样的吃吃睡睡看景点的事情,但是这些国家的风俗习惯社会制度会制约你如何吃吃睡睡游览景 ...
- 软件android_id,Android中@id和@+id及@android:id的区别介绍
前言 昨天突然有新来的同事问我这个@id 和@+id 的区别 ,为什么 我们的项目都是@id 自己新增的ui 使用的@+id 这里说下我的简单的回复项目是维护的之前的是为了统一管理使用了@id 方便 ...
- android 6.0 存储卡,Android 6.0区别U盘和SD卡设备的方法详解
如下所示: public static boolean isSdcardExists(Context context) { StorageManager storageManager = Storag ...
最新文章
- 腾讯集团与光大集团签署战略合作 共建金融科技创新实验室
- 初学 ASP.NET AJAX (一):构建 ASP.NET AJAX 开发环境
- Javascript的匿名函数与自执行
- jqgrid常用操作
- AI学习笔记--人机对话的四种形态
- html5 banner特效,HTML5特效库 CSS3遮罩banner动画特效源码
- html玫瑰花效果代码,html5渲染3D玫瑰花情人节礼物js特效代码
- 说实话,写了这么多程序了,还从来没有用JUnit作为单元测试工具测试过,今天就来学习一下
- 双稳态电路的两个稳定状态是什么_利用SR锁存器实现SPDT开关消抖电路
- python3.14_leetcode-python3-14. 最长公共前缀
- windows 2012 抓明文密码方法
- 6. Python基础:输入输出语句介绍
- 如何将百度文库中不能复制的文字复制下来
- 网络通信基础知识简介
- JavaWeb学习篇8_用户登录、信息的增删改查、复杂功能小项目(Servlet、JSP、MySQL、JDBCTemplete、Durid、BeanUtils、tomcat、EL、JSTL)
- 各种效应:蝴蝶效应、青蛙现象、鳄鱼法则、鲇鱼效应、羊群效应、刺猬法则、手表定律、破窗理论、二八定律、木桶理论、马太效应
- android 读取各分区大小,Android8 分区表变化和相关信息
- c语言中找不到EXE,windows找不到文件c:\windows\system32\msdt.exe如何解决
- 几月份应该吃哪里的水果?
- Even Or Odd?