美文网首页
[Android] wifi管理之WifiManager

[Android] wifi管理之WifiManager

作者: nlpming | 来源:发表于2023-07-31 01:15 被阅读0次

    1. WifiManager简介

    WifiManager是Android系统中负责管理WiFi网络的一个重要服务。它提供了一系列方法,允许开发者搜索、连接、保存、删除WiFi网络,还可以获取当前WiFi的连接状态、信号强度等信息。

    主要功能:

    • 连接到一个特定的WiFi网络:你可以使用WifiManager的addNetwork(WifiConfiguration config)方法,通过创建并配置WifiConfiguration对象,来指定要连接的WiFi网络。连接成功后,该网络的设置将被保存在设备中,除非明确地使用removeNetwork(int netId)方法删除。

    • 搜索附近的WiFi网络:WifiManager的startScan()方法可以启动WiFi扫描,获取附近所有可用的WiFi网络。扫描结果可以通过调用getScanResults()方法获取。

    • 获取和更改WiFi的状态:WifiManager提供了getWifiState()setWifiEnabled(boolean enabled)方法,用来获取和设置WiFi的状态。如果你想检查WiFi是否已经打开,或者你想打开或关闭WiFi,这些方法都非常有用。

    • 获取当前连接的WiFi网络的信息getConnectionInfo()方法可以获取当前连接的WiFi网络的信息,包括SSID、BSSID、速度、信号强度等。

    • 监听WiFi状态的改变:你可以使用registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法注册一个广播接收器,来监听WiFi的状态改变,包括WiFi的打开、关闭、连接状态的改变等。

    注意,在使用WifiManager时,你需要在AndroidManifest.xml文件中声明相关的权限,例如ACCESS_WIFI_STATECHANGE_WIFI_STATEACCESS_NETWORK_STATE,和CHANGE_NETWORK_STATE等。如果你想进行WiFi扫描,你还需要声明ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION权限。

    虽然WifiManager为开发者提供了许多有用的功能,但你需要注意,长时间运行WiFi扫描或者频繁地打开和关闭WiFi可能会消耗大量的电量,因此在使用时要尽可能地考虑到电量优化。

    2. WifiManager使用例子

    在Android中,你可以使用WifiManager来发起WiFi扫描,并注册一个BroadcastReceiver来接收扫描完成的广播。当扫描完成时,你可以通过WifiManager的getScanResults()方法获取扫描结果。

    以下是一个完整的例子:

    首先,你需要在你的AndroidManifest.xml文件中添加以下权限:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

    然后,在你的Activity或Service中:

    public class MainActivity extends AppCompatActivity {
    
        private WifiManager wifiManager;
        private BroadcastReceiver wifiScanReceiver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 获取WifiManager实例
            wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    
            // 创建一个BroadcastReceiver,用来接收扫描完成的广播
            wifiScanReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    boolean success = intent.getBooleanExtra(
                            WifiManager.EXTRA_RESULTS_UPDATED, false);
    
                    if (success) {
                        // 获取扫描结果
                        List<ScanResult> scanResults = wifiManager.getScanResults();
    
                        // 扫描结果是一个List,其中每一个元素代表一个扫描到的WiFi网络
                        for (ScanResult scanResult : scanResults) {
                            // 每一个ScanResult对象包含了很多信息,例如SSID、BSSID、capabilities、level等
                            String SSID = scanResult.SSID;
                            String BSSID = scanResult.BSSID;
                            String capabilities = scanResult.capabilities;
                            int level = scanResult.level;
    
                            // 你可以在这里处理每一个扫描结果
                            Log.d("WIFISCAN", "SSID: " + SSID + ", BSSID: " + BSSID);
                        }
                    } else {
                        // 扫描失败,可能需要处理错误情况
                    }
                }
            };
    
            // 创建一个IntentFilter,用来监听扫描完成的广播
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
    
            // 注册BroadcastReceiver
            registerReceiver(wifiScanReceiver, intentFilter);
    
            // 发起WiFi扫描
            wifiManager.startScan();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            // 不再需要的时候,记得要解注册BroadcastReceiver
            unregisterReceiver(wifiScanReceiver);
        }
    }
    

    以上的例子会在Activity创建时发起一次WiFi扫描,并在扫描结果可用时打印出每个扫描结果的SSID和BSSID。

    注意,为了能获取到扫描结果,你还需要在设备的设置中打开WiFi和位置权限。另外,因为WiFi扫描可能会消耗大量的电量,所以你应该尽可能地优化你的代码,避免不必要的扫描。

    3. 相关问题

    3.1 如何获取最新的wifi扫描结果?

    在Android中,当接收到WifiManager.SCAN_RESULTS_AVAILABLE_ACTION广播时,该Intent可能包含以下两个额外的参数:

    1. EXTRA_RESULTS_UPDATED(自Android 28版本起):这是一个布尔值,指示扫描是否成功完成并且结果可用。如果值为true,表示扫描结果可用且已更新。如果值为false,表示扫描未能成功完成,结果可能不可用或已过时。

    2. EXTRA_SCAN_AVAILABLE(自Android 31版本起):这是一个布尔值,指示是否还可以继续扫描。如果值为true,表示可以继续进行新的扫描。如果值为false,表示已达到扫描限制,无法继续进行新的扫描。

    以下是如何在广播接收器中使用这些额外参数的示例:

    BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
                // 检查扫描是否成功完成
                boolean success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false);
                if (success) {
                    // 获取扫描结果
                    List<ScanResult> scanResults = wifiManager.getScanResults();
                    // 处理扫描结果...
                } else {
                    // 扫描未能成功完成,结果可能不可用或已过时
                }
    
                // 检查是否还可以继续扫描
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                    boolean canScan = intent.getBooleanExtra(WifiManager.EXTRA_SCAN_AVAILABLE, true);
                    if (canScan) {
                        // 可以继续进行新的扫描
                    } else {
                        // 已达到扫描限制,无法继续进行新的扫描
                    }
                }
            }
        }
    };
    

    请注意,EXTRA_SCAN_AVAILABLE只在Android 31及更高版本中可用,因此在使用之前,你需要检查当前设备的Android版本。

    相关文章

      网友评论

          本文标题:[Android] wifi管理之WifiManager

          本文链接:https://www.haomeiwen.com/subject/rdqjpdtx.html