首页 > 代码库 > Android WIFI 简单用法

Android WIFI 简单用法

随着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信息

    // 获取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 :保存了当前连接的信号强度。

 

代码:

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热点

        // 获取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

 

        // 获取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