Android.网络连接状态(联网,2g,3g,wifi等)
来源:互联网 发布:特殊字符转json有\ 编辑:程序博客网 时间:2024/06/04 23:36
net与wap什么意思
WAP上网所谓WAP(Wireless Application Protocol)即无线应用协议,是一项全球性的网络通信协议。WAP使移动Internet 有了一个通行的标准,其目标是将Internet的丰富信息及先进的业务引入到移动电话等无线终端之中。WAP定义可通用的平台,把目前Internet网上HTML语言的信息转换成用WML(Wireless Markup Language)描述的信息,显示在移动电话的显示屏上。WAP只要求移动电话和WAP代理服务器的支持,而不要求现有的移动通信网络协议做任何的改动,因而可以广泛的运用于GSM、CDMA、TDMA、3G等多种网络。
NET是微软下一代的操作平台,它允许人们在其上构建各种应用方式,使人们尽可能通过简单的方式,多样化地、最大限度地从网站获取信息,解决网站之间的协同工作,并打破目前计算机、设备、网站、各大机构和工业界间的障碍--即所谓的“数字孤岛”,从而实现因特网的全部潜能,搭建起第三代互联网平台。
Android如何判断当前网络类型
一般对网络的判断都是判断是否联网,不过有时候我们需要知道具体的网络类型,比如在3g网络下,百度地图的定位功能存在很大的偏差,这就需要提前判断网络类型针对3g网络情况做特殊的处理。
在android中判断网络需要用到ConnectivityManager,下面的方法演示了如何用ConnectivityManager**判断当前是否联网**:
public static boolean isNetworkConnected() {ConnectivityManager cm = (ConnectivityManager) AppContext.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo ni = cm.getActiveNetworkInfo();return ni != null && ni.isConnectedOrConnecting();}
其中有个疑问,isConnectedOrConnecting()从字面上看是是否连接或者正在连接,如果正在连接的是一个不可用的网络,那应该算不联网的吧 ,所以我觉得还是改成isConnected()好些,根据个人的需求吧。
上面只是判断是否联网,跟我们的目的还有很大的差距,为了获得具体的网络类型需要对NetworkInfo中的信息进一步分解,NetworkInfo的getTypeName()方法可以判断出是wifi还是mobile网络,与getTypeName()方法对应的是getType方法,返回的是代表连接类型的整形常量,api中标明的有
ConnectivityManager.TYPE_MOBILE,
ConnectivityManager.TYPE_WIFI,
ConnectivityManager.TYPE_WIMAX,
ConnectivityManager.TYPE_ETHERNET,
ConnectivityManager.TYPE_BLUETOOTH
五种,其中只有ConnectivityManager.TYPE_MOBILE, ConnectivityManager.TYPE_WIFI是跟互联网有关的,可见ConnectivityManager并不是专门管理互联网连接的,还负责蓝牙等连接。
先定义一些整形变量代表不同的网络:
/** 没有网络 */public static final int NETWORKTYPE_INVALID = 0;/** wap网络 */public static final int NETWORKTYPE_WAP = 1;/** 2G网络 */public static final int NETWORKTYPE_2G = 2;/** 3G和3G以上网络,或统称为快速网络 */public static final int NETWORKTYPE_3G = 3;/** wifi网络 */public static final int NETWORKTYPE_WIFI = 4;
这些常量将在后面用到。
下面我们通过一个方法来实现判断是wifi还是移动网络,如果是移动网络再通过其他方法进一步分析是3g还是2g:
/** * 获取网络状态,wifi,wap,2g,3g. * * @param context 上下文 * @return int 网络状态 {@link #NETWORKTYPE_2G},{@link #NETWORKTYPE_3G}, *{@link #NETWORKTYPE_INVALID},{@link #NETWORKTYPE_WAP}* <p>{@link #NETWORKTYPE_WIFI} */ public static int getNetWorkType(Context context) { ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = manager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { String type = networkInfo.getTypeName(); if (type.equalsIgnoreCase("WIFI")) { mNetWorkType = NETWORKTYPE_WIFI; } else if (type.equalsIgnoreCase("MOBILE")) { String proxyHost = android.net.Proxy.getDefaultHost(); mNetWorkType = TextUtils.isEmpty(proxyHost) ? (isFastMobileNetwork(context) ? NETWORKTYPE_3G : NETWORKTYPE_2G) : NETWORKTYPE_WAP; } } else { mNetWorkType = NETWORKTYPE_INVALID; } return mNetWorkType; }
其中为了区别是3g还是2g我们定义了isFastMobileNetwork(context)方法,主要用到了TelephonyManager:
private static boolean isFastMobileNetwork(Context context) {TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); switch (telephonyManager.getNetworkType()) { case TelephonyManager.NETWORK_TYPE_1xRTT: return false; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_CDMA: return false; // ~ 14-64 kbps case TelephonyManager.NETWORK_TYPE_EDGE: return false; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_EVDO_0: return true; // ~ 400-1000 kbps case TelephonyManager.NETWORK_TYPE_EVDO_A: return true; // ~ 600-1400 kbps case TelephonyManager.NETWORK_TYPE_GPRS: return false; // ~ 100 kbps case TelephonyManager.NETWORK_TYPE_HSDPA: return true; // ~ 2-14 Mbps case TelephonyManager.NETWORK_TYPE_HSPA: return true; // ~ 700-1700 kbps case TelephonyManager.NETWORK_TYPE_HSUPA: return true; // ~ 1-23 Mbps case TelephonyManager.NETWORK_TYPE_UMTS: return true; // ~ 400-7000 kbps case TelephonyManager.NETWORK_TYPE_EHRPD: return true; // ~ 1-2 Mbps case TelephonyManager.NETWORK_TYPE_EVDO_B: return true; // ~ 5 Mbps case TelephonyManager.NETWORK_TYPE_HSPAP: return true; // ~ 10-20 Mbps case TelephonyManager.NETWORK_TYPE_IDEN: return false; // ~25 kbps case TelephonyManager.NETWORK_TYPE_LTE: return true; // ~ 10+ Mbps case TelephonyManager.NETWORK_TYPE_UNKNOWN: return false; default: return false; } }
整个过程可总结为:第一步通过ConnectivityManager判断是wifi还是mobile网络,在通过TelephonyManager判断移动网络的类型。
具体实现监控网络
package com.zgrb.integrationse_ysl.service;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.os.IBinder;import android.util.Log;import com.zgrb.integrationse_ysl.HomeActivity;import com.zgrb.integrationse_ysl.util.Common;import com.zgrb.integrationse_ysl.util.LogUtil;public class NetworkService extends Service { private static String TAG = "NetworkService"; private ConnectivityManager connectivityManager; private NetworkInfo networkInfo; private BroadcastReceiver NetworkReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); LogUtil.i(TAG, "======网络广播======"); if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { Log.d(TAG, "==网络状态改变"); connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isAvailable()) { String name = networkInfo.getTypeName(); LogUtil.i(TAG, "==当前使用网络:" + name); Common.isNetwordAvailable = true; } else { Common.isNetwordAvailable = false; LogUtil.e(TAG, "==没有可用网络=="); } HomeActivity.showView(context); } } }; private static final String NFCADAPTER_EXTRA_STATE = "android.nfc.extra.ADAPTER_STATE"; private static final int STATE_OFF = 1; // private static final int STATE_TURNING_ON = 2; private static final int STATE_ON = 3; // private static final int STATE_TURNING_OFF = 4; private BroadcastReceiver NfcReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.d(TAG, "== nfc action:" + action); if (action.equals(nfcAction)) { int nfcState = intent.getIntExtra(NFCADAPTER_EXTRA_STATE, -1); Log.e(TAG, "==nfcState:" + nfcState); if (nfcState == STATE_ON) { Log.e(TAG, "==nfc is opened"); Common.isNfcAvailable = true; } else if (nfcState == STATE_OFF) { Log.e(TAG, "==nfc is closed"); Common.isNfcAvailable = false; } // HomeActivity.showView(context); } } }; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); LogUtil.i(TAG, "===service==onCreate");// registerNfcReceiver(); registerNetworkReceiver(); } private void registerNetworkReceiver() { LogUtil.i(TAG, "==注册网络广播=="); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(NetworkReceiver, intentFilter); } private String nfcAction = "android.nfc.action.ADAPTER_STATE_CHANGED"; private void registerNfcReceiver() { Log.d(TAG, "==注册NFC广播=="); IntentFilter filter = new IntentFilter(); filter.addAction(nfcAction); registerReceiver(NfcReceiver, filter); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "==解绑网络广播=="); unregisterReceiver(NetworkReceiver);// unregisterReceiver(NfcReceiver); }}
源码
参考:http://blog.csdn.net/nanzhiwen666/article/details/8288433#
- Android.网络连接状态(联网,2g,3g,wifi等)
- 4.2.2.5 android 判断3G、wifi、2G等网络状态连接
- android如何判断当前网络类型(联网,2g,3g,wifi等)
- android如何判断当前网络类型(联网,2g,3g,wifi等)
- Android中手机的网络状态(判断是否联网/3G/4G/WIFI)
- android网络状态判断(wifi、3G、2G)
- android网络状态判断(wifi、3G、2G)
- Android杂谈--网络状态判断(3G/WIFI)
- 安卓获取手机的网络状态(wifi,2g,3g,4g)
- Android Network -------------------判断网络状态(网络的连接,改变,和判断2G/3G/4G)
- Android之判断网络状态(网络的连接,改变,和判断2G/3G/4G)
- Android Network --判断网络状态(网络的连接,改变,和判断2G/3G/4G)
- Android Network --判断网络状态(网络的连接,改变,和判断2G/3G/4G)
- Android Network --判断网络状态(网络的连接,改变,和判断2G/3G/4G)
- 获取手机当前的联网状态2G/3G/4G/WIFI
- 判断网络状态,2G,3G,Wifi
- 检测当前网络状态,,2g,,3g,,WiFi
- Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
- 开发常用shell脚本和命令
- 哈哈哈
- 【Scikit-Learn 中文文档】寻求帮助
- v-model绑定后设置selected问题
- PYTHON爬虫——必应图片关键词爬取
- Android.网络连接状态(联网,2g,3g,wifi等)
- 微信支付当前url未注册问题
- Web前端开发精品课HTML CSS JavaScript基础教程第十六章课后编程题答案
- thinkphp 3.2 表单数据text收集不到换行符和空格
- mysql开启远程连接服务
- 初入react-native笔记——mac安装安卓模拟器
- 解决问题:"Pyperclip could not find a copy/paste mechanism for your system. "
- 常用的css技巧
- fenge