我的Android进阶之旅------>Android检测wifi连接状态

来源:互联网 发布:vim linux c 插件 编辑:程序博客网 时间:2024/06/05 18:43

应用场景:实现判断当前网络是否可用

当前有可用网络,如下图:

当前没有可用网络,如下图:

实现步骤:

1、获取ConnectivityManager对象

Context context = activity.getApplicationContext();// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

2、获取NetworkInfo对象

// 获取NetworkInfo对象NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();

3、判断当前网络状态是否为连接状态

if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED){      return true;}

4、在AndroidManifest.xml中添加访问当前网络状态权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

代码如下:

复制代码
public class ClassTestDemoActivity extends Activity{    @Override    public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        if (isNetworkAvailable(ClassTestDemoActivity.this))        {            Toast.makeText(getApplicationContext(), "当前有可用网络!", Toast.LENGTH_LONG).show();        }        else        {            Toast.makeText(getApplicationContext(), "当前没有可用网络!", Toast.LENGTH_LONG).show();        }    }        /**     * 检查当前网络是否可用     *      * @param context     * @return     */        public boolean isNetworkAvailable(Activity activity)    {        Context context = activity.getApplicationContext();        // 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);                if (connectivityManager == null)        {            return false;        }        else        {            // 获取NetworkInfo对象            NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();                        if (networkInfo != null && networkInfo.length > 0)            {                for (int i = 0; i < networkInfo.length; i++)                {                    System.out.println(i + "===状态===" + networkInfo[i].getState());                    System.out.println(i + "===类型===" + networkInfo[i].getTypeName());                    // 判断当前网络状态是否为连接状态                    if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED)                    {                        return true;                    }                }            }        }        return false;    }}
复制代码

今天要实现监听系统Wifi连接状态,下面代码简化后提取出来的,以备后用。

step1. 编写BroadcastReceiver

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import android.content.BroadcastReceiver;  
  2. import android.content.Context;  
  3. import android.content.Intent;  
  4. import android.net.ConnectivityManager;  
  5. import android.net.NetworkInfo;  
  6. import android.net.NetworkInfo.State;  
  7. import android.net.wifi.WifiInfo;  
  8. import android.net.wifi.WifiManager;  
  9. import android.text.format.Formatter;  
  10. import android.util.Log;  
  11.   
  12. import com.canplay.systemui.QuickSettings;  
  13. /**  
  14.  * @author ouyangpeng  
  15.  * @link http://blog.csdn.net/ouyang_peng  
  16.  */  
  17. public class NetworkReceiver extends BroadcastReceiver {  
  18.     @Override  
  19.     public void onReceive(Context context, Intent intent) {  
  20.         ConnectivityManager connectivityManager = (ConnectivityManager) context  
  21.                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
  22.   
  23.         NetworkInfo net = connectivityManager.getActiveNetworkInfo();  
  24.         if (net == null) {  
  25.             Log.i("@@@@@@@@@@@@NetworkReceiver", "无网络连接");  
  26.         } else {  
  27.             Log.i("@@@@@@@@@@@@NetworkReceiver", "网络连接类型为" + net.getTypeName());  
  28.         }  
  29.         // wifi连接状态  
  30.         State wifi = connectivityManager.getNetworkInfo(  
  31.                 ConnectivityManager.TYPE_WIFI).getState();  
  32.         if (wifi == State.CONNECTED || wifi == State.CONNECTING) {  
  33.             Log.i("@@@@@@@@@@@@NetworkReceiver", "连接wifi");  
  34.             // wifi管理  
  35.             WifiManager wifiManager = (WifiManager) context  
  36.                     .getSystemService(Context.WIFI_SERVICE);  
  37.             WifiInfo wifiInfo = wifiManager.getConnectionInfo();  
  38.             StringBuffer sb = new StringBuffer();  
  39.             sb.append("\n获取BSSID属性(所连接的WIFI设备的MAC地址):" + wifiInfo.getBSSID());  
  40.             // sb.append("getDetailedStateOf()  获取客户端的连通性:");  
  41.             sb.append("\n\n获取SSID 是否被隐藏:" + wifiInfo.getHiddenSSID());  
  42.             // IP地址转化为字符串格式  
  43.             sb.append("\n\n获取IP 地址:" +  Formatter.formatIpAddress(wifiInfo.getIpAddress()));  
  44.             sb.append("\n\n获取连接的速度:" + wifiInfo.getLinkSpeed());  
  45.             sb.append("\n\n获取Mac 地址(手机本身网卡的MAC地址):" + wifiInfo.getMacAddress()==null?"No Wifi Device":wifiInfo.getMacAddress());  
  46.             sb.append("\n\n获取802.11n 网络的信号:" + wifiInfo.getRssi());  
  47.             sb.append("\n\n获取SSID(所连接的WIFI的网络名称):" + wifiInfo.getSSID());  
  48.             sb.append("\n\n获取具体客户端状态的信息:" + wifiInfo.getSupplicantState());  
  49.             Log.i("@@@@@@@@@@@@NetworkReceiver", "连接wifi的信息:\n"+sb.toString());  
  50.               
  51.         } else if (wifi == State.DISCONNECTED || wifi == State.DISCONNECTING) {  
  52.             Log.i("@@@@@@@@@@@@NetworkReceiver", "断开wifi");  
  53.         }         
  54.           
  55.     }  
  56. }  


step2. 配置BroadcastReceiver和相关权限

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  2. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <!-- 检测网络 -->  
  2. <receiver android:name=".NetworkReceiver" >  
  3.     <intent-filter>  
  4.         <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  
  5.     </intent-filter>  
  6.      <!-- 开机启动的广播 -->    
  7.     <intent-filter>    
  8.         <action android:name="android.intent.action.BOOT_COMPLETED"/>    
  9.     </intent-filter>    
  10. </receiver>  


下面是通过logcat打印出来的信息

当wifi连接上时候的信息:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. I/@@@@@@@@@@@@NetworkReceiver( 1653): 网络连接类型为WIFI  
  2. I/@@@@@@@@@@@@NetworkReceiver( 1653): 连接wifi  
  3. I/@@@@@@@@@@@@NetworkReceiver( 1653): 连接wifi的信息:  
  4. I/@@@@@@@@@@@@NetworkReceiver( 1653):   
  5. I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取BSSID属性(所连接的WIFI设备的MAC地址):20:dc:e6:71:10:e6  
  6. I/@@@@@@@@@@@@NetworkReceiver( 1653):   
  7. I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取SSID 是否被隐藏:false  
  8. I/@@@@@@@@@@@@NetworkReceiver( 1653):   
  9. I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取IP 地址:192.168.1.115  
  10. I/@@@@@@@@@@@@NetworkReceiver( 1653):   
  11. I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取连接的速度:48cc:b2:55:58:f2:02  
  12. I/@@@@@@@@@@@@NetworkReceiver( 1653):   
  13. I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取802.11n 网络的信号:-49  
  14. I/@@@@@@@@@@@@NetworkReceiver( 1653):   
  15. I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取SSID(所连接的WIFI的网络名称):FORMIKE  
  16. I/@@@@@@@@@@@@NetworkReceiver( 1653):   
  17. I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取具体客户端状态的信息:COMPLETED  

当wifi断开时候的信息:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. I/@@@@@@@@@@@@NetworkReceiver( 1653): 无网络连接  
  2. I/@@@@@@@@@@@@NetworkReceiver( 1653): 断开wifi  



0 0