目录
1. AndroidManifest.xml 中声明必要的权限
在 Android 中实现 Wi-Fi 的自动连接可以通过 WifiManager
来完成。下面是一个示例代码,展示了如何自动连接到指定的 Wi-Fi 网络。需要注意的是,从 Android 10 (API level 29) 开始,某些 Wi-Fi 操作要求应用有相关权限,并且有些操作无法直接在后台执行。
前提条件
- 权限声明:在
AndroidManifest.xml
中需要添加 Wi-Fi 相关的权限。 - 应用所需权限:从 Android 10 开始,涉及 Wi-Fi 操作的权限要求更加严格,因此需要检查权限的动态获取。
代码示例:自动连接到 Wi-Fi 网络
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.util.Log;
public class WifiAutoConnect {
private WifiManager wifiManager;
private static final String TAG = "WifiAutoConnect";
public WifiAutoConnect(Context context) {
// 初始化 WifiManager
wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
}
public void connectToWifi(String ssid, String password) {
// 打开Wi-Fi
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
}
// 创建 Wi-Fi 配置
WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = String.format("\"%s\"", ssid); // SSID 需要用双引号包裹
wifiConfig.preSharedKey = String.format("\"%s\"", password); // 密码需要用双引号包裹
// 添加 Wi-Fi 网络
int netId = wifiManager.addNetwork(wifiConfig);
if (netId == -1) {
Log.e(TAG, "Wi-Fi 网络配置添加失败");
return;
}
// 断开当前 Wi-Fi
wifiManager.disconnect();
// 连接到指定的 Wi-Fi 网络
wifiManager.enableNetwork(netId, true);
// 重新连接
wifiManager.reconnect();
Log.d(TAG, "正在连接到 Wi-Fi: " + ssid);
}
}
1. AndroidManifest.xml 中声明必要的权限
<uses-permission android:name="android.permission.INTERNET" />
<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" /> <!-- Android 10 以上需要 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Android 10 以上需要 -->
2. 说明代码中的主要操作
-
WifiManager
:用于管理设备的 Wi-Fi 连接。我们通过它来打开 Wi-Fi、添加 Wi-Fi 配置、并尝试连接到指定的网络。 -
WifiConfiguration
:用于设置 Wi-Fi 网络的 SSID 和密码,SSID 和密码都需要用双引号包裹。 -
addNetwork
:将配置的 Wi-Fi 网络添加到系统中。如果返回的netId
为-1
,说明添加失败。 -
enableNetwork
:启用指定的 Wi-Fi 网络。 -
reconnect
:连接到已经启用的 Wi-Fi 网络。
3. 动态权限请求(Android 6.0+)
如果你的应用运行在 Android 6.0 或更高版本,你还需要动态请求位置权限,因为从 Android 6.0 开始,Wi-Fi 扫描结果需要获取位置权限。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
}
4. 注意事项
- 从 Android 10 开始,Wi-Fi 连接的 API 发生了变化,某些操作被限制,需要使用
WifiNetworkSpecifier
或者WifiManager
的相关新 API。 - 在 Android 6.0 及以上版本,获取 Wi-Fi 列表需要获取位置权限。