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_STATE
,CHANGE_WIFI_STATE
,ACCESS_NETWORK_STATE
,和CHANGE_NETWORK_STATE
等。如果你想进行WiFi扫描,你还需要声明ACCESS_FINE_LOCATION
或ACCESS_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可能包含以下两个额外的参数:
EXTRA_RESULTS_UPDATED
(自Android 28版本起):这是一个布尔值,指示扫描是否成功完成并且结果可用。如果值为true,表示扫描结果可用且已更新。如果值为false,表示扫描未能成功完成,结果可能不可用或已过时。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版本。