Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面

来源:互联网 发布:网络禁书40本目录 编辑:程序博客网 时间:2024/06/06 19:19

Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面

获取网络连接状态
随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能。
Android平台提供了ConnectivityManager  类,用于网络连接状态的检测。
Android开发文档这样描述ConnectivityManager 的作用:

Class that answers queries about the state of network connectivity. It also notifies applications when network connectivity changes. Get an instance of this class by callingContext.getSystemService(Context.CONNECTIVITY_SERVICE).
The primary responsibilities of this class are to:





    Monitor network connections (Wi-Fi, GPRS, UMTS, etc.) Send broadcast intents when network connectivity changes Attempt to "fail over" to another network when connectivity to a network is lost
  • Provide an API that allows applications to query the coarse-grained or fine-grained state of the available networks 
下面这个简单的例子 checkNetworkInfo() 说明了如何编程获取Android手机的当前网络状态

  1. private void checkNetworkInfo()
  2.     {
  3.         ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);[/font]
  4.      //mobile 3G Data Network
  5.         State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
  6.         txt3G.setText(mobile.toString()); //显示3G网络连接状态
  7.         //wifi
  8.         State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
  9.         txtWifi.setText(wifi.toString()); //显示wifi连接状态
  10.     }
复制代码

注:

根据Android的安全机制,在使用ConnectivityManager时,必须在AndroidManifest.xml中添加<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 否则无法获得系统的许可。

运行结果(关闭3G及wifi网络连接的状态下)
2011011111122062.jpg 


调用Android手机的网络配置界面
使用过Android手机上的手机QQ的朋友,应该知道,当QQ启动时,如果没有有效的网络连接,QQ会提示转入手机的网络配置界面。这是如何实现的呢。其实很简单啦
  1. private void checkNetworkInfo()
  2.     {
  3.         ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);[/font]
  4.       //mobile 3G Data Network
  5.         State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
  6.         txt3G.setText(mobile.toString());
  7.         //wifi
  8.         State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
  9.         txtWifi.setText(wifi.toString());
  10.         
  11.         //如果3G网络和wifi网络都未连接,且不是处于正在连接状态 则进入Network Setting界面 由用户配置网络连接
  12.         if(mobile==State.CONNECTED||mobile==State.CONNECTING)
  13.             return;
  14.         if(wifi==State.CONNECTED||wifi==State.CONNECTING)
  15.             return;
  16.         
  17.         
  18.         startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));//进入无线网络配置界面
  19.         //startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); //进入手机中的wifi网络设置界面
  20.         
  21.     }

  22. 运行结果(关闭3G及wifi网络连接的状态下),程序转入无线网络配置界面

  23. startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));//进入无线网络配置界面[/font]

复制代码
2011011111180633.jpg 


如果调用

startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); //直接进入手机中的wifi网络设置界面

则直接进入手机中的wifi网络设置界面 

2011011111194986.jpg 


在wifi网络连接后 运行该程序

2011011111203975.jpg 


我们可以看到 wi-fi 状态为已连接(CONNECTED).


Android 连网状态检测

java代码:


  1. public static boolean isConnect(Context context) {

  2. // 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
  3. try {

  4. ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

  5. if (connectivity != null) {

  6. // 获取网络连接管理的对象
  7. NetworkInfo info = connectivity.getActiveNetworkInfo();

  8. if (info != null&& info.isConnected()) {

  9. // 判断当前网络是否已经连接

  10. if (info.getState() == NetworkInfo.State.CONNECTED) {
  11. return true;
  12. }
  13. }
  14. }

  15. } catch (Exception e) {


  16. // TODO: handle exception

  17. Log.v("error",e.toString());

  18. }
  19. return false;




 android判断2g|3g网络

可以通过ConnectivityManager获取当前网络连接状态,通过状态值判别当前网络连接

NetworkInfo info = conMan.getActiveNetworkInfo();


      if(info !=null && info.getType() ==  ConnectivityManager.TYPE_MOBILE)
      {

       // NETWORK_TYPE_EVDO_A是电信3G

      //NETWORK_TYPE_EVDO_A是中国电信3G的getNetworkType

      //NETWORK_TYPE_CDMA电信2G是CDMA

      //移动2G卡 + CMCC + 2//type = NETWORK_TYPE_EDGE

      //联通的2G经过测试 China Unicom   1 NETWORK_TYPE_GPRS


       if(info.getSubtype() == TelephonyManager.NETWORK_TYPE_GPRS

           || info.getSubtype() == TelephonyManager.NETWORK_TYPE_CDMA
           || info.getSubtype() == TelephonyManager.NETWORK_TYPE_EDGE){
          System.out.println("mobile connected");
       }
       else{
            System.out.println("type:"+info.getSubtype());
             System.out.println("not mobile");
       }
      }else
      System.out.println("not mobile connected");

通过getType的值可以得到以下2g|3g网络

networktype 1~15分别为:联通2G,移动2G,电信2G,电信3G,电信3G,电信3G,联通3G,联通3G,LTE,IDEN,HSUPA,HSPA,HSPAP


 android 网络状态判断(3G/WIFI)

http://www.eoeandroid.com/thread-207475-1-1.html这篇文章中已经介绍了网络状态的判断,但是测试后发现用此方法只能够判断WIFI是否连接,而现在的智能机可以是wifi、3G、甚至2G。那么如果用上面的方法就不行了需要进行一下修改,使其在网络不连接(无论wifi、3G、2G)的时候也可以判断。代码如下


  1. //Check network
  2.     public void CheckNetworkState()
  3.     {
  4.         boolean flag = false;
  5.         ConnectivityManager manager = (ConnectivityManager)getSystemService(
  6.                 Context.CONNECTIVITY_SERVICE);
  7.         State mobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
  8.         State wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
  9.         //如果3G、wifi、2G等网络状态是连接的,则退出,否则显示提示信息进入网络设置界面
  10.         if(mobile == State.CONNECTED||mobile==State.CONNECTING)
  11.         return;
  12.         if(wifi == State.CONNECTED||wifi==State.CONNECTING)
  13.         return;
  14.         showTips();
  15.     }
  16.     
  17.     private void showTips()
  18.     {
  19.         AlertDialog.Builder builder = new AlertDialog.Builder(this);
  20.         builder.setIcon(android.R.drawable.ic_dialog_alert);
  21.         builder.setTitle(R.string.netstate);
  22.         builder.setMessage(R.string.setnetwork);
  23.         builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
  24.             
  25.             @Override
  26.             public void onClick(DialogInterface dialog, int which) {
  27.                 // 如果没有网络连接,则进入网络设置界面
  28.                 startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
  29.             }
  30.         });
  31.         builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
  32.             
  33.             @Override
  34.             public void onClick(DialogInterface dialog, int which) {
  35.                 dialog.cancel();
  36.             }
  37.         });
  38.         builder.create();
  39.         builder.show();
  40.     }
复制代码
这种方式更加简单,也更加有用,当然第一篇也有可取之处,可以加入3G状态检查即可
注意:别忘了加上权限

原文:http://www.cnblogs.com/loulijun/archive/2012/02/10/2345667.html


network: Android 网络判断(wifi、3G与其他)

public class NetworkProber { 

/** 
* 网络是否可用 

* @param activity 
* @return 
*/ 
public static boolean isNetworkAvailable(Context context) { 
ConnectivityManager connectivity = (ConnectivityManager) context 
.getSystemService(Context.CONNECTIVITY_SERVICE); 
if (connectivity == null) { 
} else { 
NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
if (info != null) { 
for (int i = 0; i < info.length; i++) { 
if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
return true; 




return false; 


/** 
* Gps是否打开 

* @param context 
* @return 
*/ 
public static boolean isGpsEnabled(Context context) { 
LocationManager locationManager = ((LocationManager) context 
.getSystemService(Context.LOCATION_SERVICE)); 
List<String> accessibleProviders = locationManager.getProviders(true); 
return accessibleProviders != null && accessibleProviders.size() > 0; 


/** 
* wifi是否打开 
*/ 
public static boolean isWifiEnabled(Context context) { 
ConnectivityManager mgrConn = (ConnectivityManager) context 
.getSystemService(Context.CONNECTIVITY_SERVICE); 
TelephonyManager mgrTel = (TelephonyManager) context 
.getSystemService(Context.TELEPHONY_SERVICE); 
return ((mgrConn.getActiveNetworkInfo() != null && mgrConn 
.getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED) || mgrTel 
.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS); 


/** 
* 判断当前网络是否是wifi网络 
* if(activeNetInfo.getType()==ConnectivityManager.TYPE_MOBILE) { //判断3G网 

* @param context 
* @return boolean 
*/ 
public static boolean isWifi(Context context) { 
ConnectivityManager connectivityManager = (ConnectivityManager) context 
.getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
if (activeNetInfo != null 
&& activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { 
return true; 

return false; 


/** 
* 判断当前网络是否是3G网络 

* @param context 
* @return boolean 
*/ 
public static boolean is3G(Context context) { 
ConnectivityManager connectivityManager = (ConnectivityManager) context 
.getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
if (activeNetInfo != null 
&& activeNetInfo.getType() == ConnectivityManager.TYPE_MOBILE) { 
return true; 

return false; 


另外还有两个方法判断网络是否可用:

public static boolean isNetworkAvailable_00(Context context) { 
ConnectivityManager cm = ((ConnectivityManager) context 
.getSystemService(Context.CONNECTIVITY_SERVICE)); 
if (cm != null) { 
NetworkInfo info = cm.getActiveNetworkInfo(); 
if (info != null && info.isConnectedOrConnecting()) { 
return true; 


return false; 


public static boolean isNetworkAvailable_01(Context context) { 
ConnectivityManager cm = (ConnectivityManager) context 
.getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo network = cm.getActiveNetworkInfo(); 
if (network != null) { 
return network.isAvailable(); 

return false; 

更加严谨的写法: 
public static boolean checkNet(Context context) { 

try { 
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
if (connectivity != null) { 

NetworkInfo info = connectivity.getActiveNetworkInfo(); 
if (info != null && info.isConnected()) { 

if (info.getState() == NetworkInfo.State.CONNECTED) { 
return true; 



} catch (Exception e) { 
return false; 

return false; 
}


原创粉丝点击