[Android] wifi管理之WifiManager

2023-07-31  本文已影响0人  nlpming

1. WifiManager简介

WifiManager是Android系统中负责管理WiFi网络的一个重要服务。它提供了一系列方法,允许开发者搜索、连接、保存、删除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版本。

上一篇下一篇

猜你喜欢

热点阅读