随着Wifi的普及,在开发App的时候对wifi的考虑越来越多了。例如程序的升级在wifi下可以省很多流量,在通信软件中的视频通话。可以实现高画质的传输等等,Android提供了WifiManager类来帮助开发者们管理Wifi。下面就简单来说一下WifiManager的简单用法把。

 

权限:

为了使用WfiManager 我们需要在Androidmanifest.xml 加入权限:
//本例中使用了前两个。具体请按照需要添加权限。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="adnroid.permission.CHANGE_WIFI_STATE"></uses-permission>
 
<uses-permission android:name="adnroid.permission.ACCESS_CHECKIN_PROPERTTES"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"></uses-permission>

获取当前连接WIFI信息




android wifi状态下走移动流量 android实现wifi功能_android

android wifi状态下走移动流量 android实现wifi功能_Code_02

// 获取WifiManager
        final WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);

        btnStart = (Button) findViewById(R.id.button1);
        btnStart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {

                // 获取当前连接WIFI的信息
                WifiInfo info = wm.getConnectionInfo();
                // 判断当前是否有连接的WIFI
                if (info.getBSSID() != null) {
                    // 信号强度
                    int strength = WifiManager.calculateSignalLevel(
                            info.getRssi(), 100);
                    // 连接速度
                    int speed = info.getLinkSpeed();
                    // 获取BSSID地址。
                    String bssid = info.getBSSID();
                    // 获取SSID地址。 需要连接网络的ID
                    String ssid = info.getSSID();

                    String text = String.format(
                            "当前Wifi信号强度%s,网络速度%s,SSID:%s,BSSID:%s", strength,
                            speed, ssid, bssid);
                    Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT)
                            .show();
                }

            }
        });


View Code


 

WifiInfo类常用的方法

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():  获取连接速度,可以让用户获知这一信息(单位Mbps)。
info.getRssi():     获取RSSI,RSSI就是接受信号强度指示。

 

PS:可以使用WifiManager的setWifiEnable 开启或者禁用WIFI硬件。或者使用getWifiState,或者isWifiEnable方法请求当前Wifi状态

 

 

 

监听Wifi连接

监听WIFI可以让我们的应用程序更健壮。如正在播放音乐时WIFI断开连接,提醒用户。

监听WIFI有两种方式:

(1)使用ConnectivityManager类来实现。其他随笔中写

(2)使用BroadcastReceiver监听,每当Wifi连接发生变化时,WifiManager会广播对应的Intent。告知当前WIFI的状态。

常用的Inten Action如下:

 

(1)WIFI_STATE_CHANGED_ACTION:当wifi硬件已经发生变化广播,常用的几种状态“enabling”,“enabled”,“disabling”,“disabled”,“unknown”等,他包含了两个Extra。

  EXTRA_WIFI_STATE:新的wifi状态

  EXTRA_PREVIOUS_STATE:前一次的Wifi状态。

 

(2)SUPPLICANT_CONNECTION_CHANGE_ACTION:请求的连接已经建立(现在可以使用),或连接请求已经丢失。他包含了一个EXTRA。

  EXTRA_NEW_STATE:参数值是“true” 或 “false”

 

(3)NETWORK_STATE_CHANGED_ACTION:当WIFI连接状态发生变化时触发,他包含了两个Extran,

  EXTRA_NETWORK_INFO:  包含了详细描述当前网络状态的networkInfo对象

  EXTRAN_BSSID:  当前所连接接入点的BSSID

 

(4)RSSI_CHANGED_ACTION:可以用来监听当前连接WIFI的信号强度。为了获取当前WIFI信号强度需要使用WifiManager.calculateSignalLevel来设置信号强度范围,他会把当前的信号强  度,按照设置的范围返回一个整型数值。(如:WifiManager.calculateSignalLevel(wifimanager.getRssi(),100)当信号最强的时候可以返回99,因为他是从0开始计算的所以不会到    100)。他包含了一个Extra。

  EXTRA_NEW_RSSI :保存了当前连接的信号强度。

 

代码:




android wifi状态下走移动流量 android实现wifi功能_android

android wifi状态下走移动流量 android实现wifi功能_Code_02

public class WifiBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        // 监听当前连接的WIFI状态
        int state = intent.getIntExtra("wifi_state",
                WifiManager.WIFI_STATE_DISABLED);

        switch (state) {
        case WifiManager.WIFI_STATE_DISABLING:
            // 正在停止
            break;
        case WifiManager.WIFI_STATE_DISABLED:
            // 已停止
            break;
        case WifiManager.WIFI_STATE_ENABLING:
            // 正在打开
            break;
        case WifiManager.WIFI_STATE_ENABLED:
            // 已开启
            break;
        case WifiManager.WIFI_STATE_UNKNOWN:
            // 未知
            break;
        }
    }

}


View Code


 

在AndroidManifest.xml 注册BroadcasetReceiver

<receiver android:name=".WifiBroadcastReceiver" >
 <intent-filter>
 <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
 </intent-filter>
 </receiver>

 

PS:此处还可以监听更多的关于WifiManageer广播的Intent。如上面的四个比较常用的。

 

扫描,管理WIFI

(1)扫描WIFI热点




android wifi状态下走移动流量 android实现wifi功能_android

android wifi状态下走移动流量 android实现wifi功能_Code_02

// 获取WifiManager
        final WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);

        btnStart = (Button) findViewById(R.id.button1);
        btnStart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //开始扫描
                wm.startScan();
            }
        });

        // 注册广播,接收wifi扫描结果
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                // 获取所有扫描到的WIFI,可以获取Wifi的相关信息。如信号强度,链接速度,SSID,身份验证等
                List<ScanResult> list = wm.getScanResults();

                Toast.makeText(MainActivity.this,
                        MessageFormat.format("共找到{0}个wifi", list.size()),
                        Toast.LENGTH_SHORT).show();
                
            }
        }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));


View Code


 

ps:这里注意一下intent filter的Action是“SCAN_RESULTS_AVAILABLE_ACTION”

 

(2)管理WIFI

 




android wifi状态下走移动流量 android实现wifi功能_android

android wifi状态下走移动流量 android实现wifi功能_Code_02

// 获取WifiManager
        final WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);

        btnStart = (Button) findViewById(R.id.button1);
        btnStart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // 获取已配置WIFI列表
                List<WifiConfiguration> list = wm.getConfiguredNetworks();
                
                if (list.size() > 0) {
                    String txt = "";
                    for (WifiConfiguration wc : list) {
                        txt += wc.SSID + " ";
                    }

                    Toast.makeText(
                            MainActivity.this,
                            MessageFormat.format("您已经配置了{0}个wifi连接,分别是{1}",
                                    list.size(), txt), Toast.LENGTH_SHORT)
                            .show();
                    boolean disableOthers=true;
                    //连接第一个WIFI,其他WIFI不可用
                    wm.enableNetwork(list.get(0).networkId, disableOthers);
                }
            }

        });


View Code