Android 13 WiFi扫描源码分析

在 Android 13 中,WiFi 扫描功能得到了强化,新的 API 使得开发者可以更高效地访问 WiFi 网络信息。本文将对 Android 13 的 WiFi 扫描功能进行深入分析,并结合代码示例予以说明。

WiFi 扫描的基本流程

在 Android 设备中,WiFi 扫描的流程可以概括为以下几个步骤:

  1. 权限请求:请求必要的权限。
  2. 开启 WiFi:确保 Wi-Fi 功能已开启。
  3. 开始扫描:调用系统 API 开始扫描。
  4. 接收扫描结果:使用回调接收扫描结果。

权限请求

首先,我们需要在 AndroidManifest.xml 中声明必要的权限:

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

在 Android 6.0 及以上版本,运行时权限必不可少。下面是如何请求权限的例子:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_CODE);
}

开启 WiFi

在请求完成后,需要确保 Wi-Fi 功能已开启。可以通过 WifiManager 来控制 Wi-Fi:

WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (!wifiManager.isWifiEnabled()) {
    wifiManager.setWifiEnabled(true);
}

开始扫描

接下来,我们可以启动 WiFi 扫描。在 Android 13 中,可以使用新的 startScan 方法:

List<ScanResult> results = wifiManager.getScanResults();
for(ScanResult result : results) {
    // 处理扫描结果
    Log.d("WiFiScan", "SSID: " + result.SSID + ", BSSID: " + result.BSSID);
}

接收扫描结果

我们可以通过设置一个 BroadcastReceiver 来接收扫描结果:

private final BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        List<ScanResult> results = wifiManager.getScanResults();
        for (ScanResult result : results) {
            Log.d("WiFiScan", "Found network: " + result.SSID);
        }
    }
};

// 注册接收器
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(wifiScanReceiver, filter);

取消注册

应用退出或不再需要接收扫描结果时,应当取消注册:

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(wifiScanReceiver);
}

类图

下面通过一个类图来展示涉及到的主要类及其关系:

classDiagram
    class MainActivity {
        + void onCreate()
        + void requestPermissions()
        + void startWifiScan()
        + void onDestroy()
    }
    class WifiManager {
        + void setWifiEnabled(bool)
        + List<ScanResult> getScanResults()
    }
    class ScanResult {
        + String SSID
        + String BSSID
    }
    
    MainActivity --> WifiManager
    WifiManager --> ScanResult

旅行图

接下来的旅行图将展示 WiFi 扫描的整体流程:

journey
    title WiFi Scan Process
    section 权限请求
      请求位置权限: 5: 主应用-> 系统 :  "请求权限"
      授权成功: 5: 系统 -> 主应用 :  "返回权限结果"
    
    section 启用 WiFi
      检查 Wifi 状态: 5: 主应用 -> WifiManager :  "检查 Wifi 状态"
      启用 Wifi: 5: WifiManager -> WifiManager :  "启用 Wifi"
    
    section 开始扫描
      开始扫描: 5: 主应用 -> WifiManager :  "开始扫描"
      接收扫描结果: 5: WifiManager -> 主应用 : "返回扫描结果"
    
    section 清理工作
      取消注册接收器: 5: 主应用 -> 系统 :  "注销接收器"

总结

本文对 Android 13 的 WiFi 扫描功能进行了详细分析,从权限请求到扫描结果接收,涵盖了整个流程与关键代码实现。新的 API 不仅提高了开发者的工作效率,也增强了用户体验。希望通过这篇文章,能够帮助开发者更好地理解并利用 Android 13 的 WiFi 功能。在实际开发中,请注意遵循最佳实践,以确保应用程序的安全性与可靠性。