Android WIFI信息獲取

jopen 9年前發布 | 17K 次閱讀 Android Android開發 移動開發

在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"/>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!