Android WIFI信息获取

jopen 9年前

在androi中WIFI信息的获取可以通过系统提供的WIFI Service获取

[java] 
WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE); 
WifiInfo    wifiInfo     = wifi_service.getConnectionInfo(); 

其中WifiInfo 中比较常用的信息有:
[java] 
 /*
   info.getBSSID();      获取BSSID地址。
   info.getSSID();       获取SSID地址。  需要连接网络的ID
   info.getIpAddress();  获取IP地址。4字节Int, XXX.XXX.XXX.XXX 每个XXX为一个字节
   info.getMacAddress(); 获取MAC地址。
   info.getNetworkId();  获取网络ID。
   info.getLinkSpeed();  获取连接速度,可以让用户获知这一信息。
   info.getRssi();       获取RSSI,RSSI就是接受信号强度指示
*/ 

同时可以通过接收系统的广播,获取当前WIFI的状态
[java]
 /*
   WifiManager.WIFI_STATE_DISABLING   正在停止
   WifiManager.WIFI_STATE_DISABLED    已停止
   WifiManager.WIFI_STATE_ENABLING    正在打开
   WifiManager.WIFI_STATE_ENABLED     已开启
   WifiManager.WIFI_STATE_UNKNOWN     未知
*/ 

以下给出具体的实例:
1.在布局文件中增加一个WIFI图标,和显示具体信息的文本  (activity_wifi_example.xml)
[html] 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"  
    android:gravity="center" 
    android:orientation="vertical"> 
 
    <ImageButton 
        android:id="@+id/Icon_WifiStatus" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/ic_wifi"/> 
     
    <TextView 
        android:id="@+id/Label_WifiDetail" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:maxWidth="320dp"/> 
 
</LinearLayout> 

2. 为WIFI图标添加一组可选的图标,在drawable-hdpi目录下增加ic_wifi.xml文件,内容如下:
[html] view plaincopy
<level-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:maxLevel="0"   android:drawable="@drawable/ic_wifi_s0" /> 
    <item android:maxLevel="50"  android:drawable="@drawable/ic_wifi_s3" /> 
    <item android:maxLevel="70"  android:drawable="@drawable/ic_wifi_s2" /> 
    <item android:maxLevel="100" android:drawable="@drawable/ic_wifi_s1" /> 
</level-list> 
注意需要导入用到的图片

3.在代码中接收WIFI状态广播,开启一个500ms的Timer实时查询WIFI状态 (WifiExample.java)

[java] 
package com.example.wifiexample; 
 
import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.net.wifi.WifiInfo; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.ImageButton; 
import android.widget.TextView; 
 
public class WifiExample extends Activity { 
 
    private final String TAG = "WifiExample"; 
     
    private IntentFilter      mWifiIntentFilter; 
    private BroadcastReceiver mWifiIntentReceiver; 
     
    private ImageButton       mIconWifi; 
    private TextView          mLabelWifi; 
    private Handler           mHandler; 
     
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_wifi_example); 
         
        mIconWifi  = (ImageButton)findViewById(R.id.Icon_WifiStatus); 
        mLabelWifi = (TextView)findViewById(R.id.Label_WifiDetail);  
                 
        mWifiIntentFilter = new IntentFilter(); 
        mWifiIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 
         
        mWifiIntentReceiver = new mWifiIntentReceiver(); 
        registerReceiver(mWifiIntentReceiver, mWifiIntentFilter); 
         
        mHandler = new Handler(); 
        mHandler.post(new TimerProcess()); 
    } 
 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        getMenuInflater().inflate(R.menu.activity_wifi_example, menu); 
        return true; 
    } 
     
    private class TimerProcess implements Runnable{ 
        public void run() { 
            showWIFIDetail(); 
            mHandler.postDelayed(this, 500); 
        } 
    } 
     
    public void showWIFIDetail() 
    { 
        WifiInfo info = ((WifiManager)getSystemService(WIFI_SERVICE)).getConnectionInfo(); 
        mIconWifi.setImageLevel(Math.abs(info.getRssi())); 
         
        /*
        info.getBSSID();      获取BSSID地址。
        info.getSSID();       获取SSID地址。  需要连接网络的ID
        info.getIpAddress();  获取IP地址。4字节Int, XXX.XXX.XXX.XXX 每个XXX为一个字节
        info.getMacAddress(); 获取MAC地址。
        info.getNetworkId();  获取网络ID。
        info.getLinkSpeed();  获取连接速度,可以让用户获知这一信息。
        info.getRssi();       获取RSSI,RSSI就是接受信号强度指示
         */ 
         
        int Ip = info.getIpAddress(); 
        String strIp = "" + (Ip & 0xFF) + "." + ((Ip >> 8) & 0xFF) + "." + ((Ip >> 16) & 0xFF) + "." + ((Ip >> 24) & 0xFF); 
         
        mLabelWifi.setText("BSSID : " + info.getBSSID() + "\nSSID : " + info.getSSID() +  
                "\nIpAddress : " + strIp + "\nMacAddress : " + info.getMacAddress() + 
                "\nNetworkId : " + info.getNetworkId() + "\nLinkSpeed : " + info.getLinkSpeed() + "Mbps" +  
                "\nRssi : " + info.getRssi()); 
        info.getIpAddress(); 
    } 
     
    private class mWifiIntentReceiver extends BroadcastReceiver{ 
 
        public void onReceive(Context context, Intent intent) { 
 
            WifiInfo info = ((WifiManager)getSystemService(WIFI_SERVICE)).getConnectionInfo(); 
            mIconWifi.setImageLevel(Math.abs(info.getRssi())); 
         
            /*
            WifiManager.WIFI_STATE_DISABLING   正在停止
            WifiManager.WIFI_STATE_DISABLED    已停止
            WifiManager.WIFI_STATE_ENABLING    正在打开
            WifiManager.WIFI_STATE_ENABLED     已开启
            WifiManager.WIFI_STATE_UNKNOWN     未知
             */ 
             
            switch (intent.getIntExtra("wifi_state", 0)) { 
            case WifiManager.WIFI_STATE_DISABLING: 
                Log.d(TAG, "WIFI STATUS : WIFI_STATE_DISABLING"); 
                break; 
            case WifiManager.WIFI_STATE_DISABLED: 
                Log.d(TAG, "WIFI STATUS : WIFI_STATE_DISABLED"); 
                break; 
            case WifiManager.WIFI_STATE_ENABLING: 
                Log.d(TAG, "WIFI STATUS : WIFI_STATE_ENABLING"); 
                break; 
            case WifiManager.WIFI_STATE_ENABLED: 
                Log.d(TAG, "WIFI STATUS : WIFI_STATE_ENABLED"); 
                break; 
            case WifiManager.WIFI_STATE_UNKNOWN: 
                Log.d(TAG, "WIFI STATUS : WIFI_STATE_UNKNOWN"); 
                break; 
        } 
    } 
    } 

4.最后在AndroidManifest.xml增加获取WIFI权限的支持
 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>