• 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
  • 相关阅读:
    C#_委托
    一个asp+ACCESS省市二级联动菜单程序
    asp怎么实现二级联动下拉菜单
    ASP用户登录代码
    Windows 2003 IIS 不支持ASP的问题
    iptables
    VNC ( Virtual Network Computing )
    MongoDB的备份(mongodump)与恢复(mongorestore)
    Locally managed (LMT) vs. Dictionary managed (DMT) tablespace
    向现有的磁盘组加入/删除ASM磁盘
  • 原文地址:https://www.cnblogs.com/ywtk/p/3872702.html
Copyright © 2020-2023  润新知