针对于不同版本之间的WiFi连接,目前国内的各大手机厂商在前段时间发布了声明,需要在24年将App的targetSDK升级到>=30,所以针对WiFi的连接进行了修改 目前是两个方法去进行wifi的连接,第一种方法需要在targetSDK<=28时使用,在这个版本中连接的wifi是一点问题没有的,可以对wifi进行更多的操作,话不多说上代码:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
WifiConfiguration wifiConfiguration = new WifiConfiguration();
wifiConfiguration.SSID = "\"" + scanResult.SSID + "\"";
wifiConfiguration.status = WifiConfiguration.Status.DISABLED;
if (isNetworkPasswordProtected(scanResult) && password != null) {
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wifiConfiguration.preSharedKey = "\"" + password + "\"";
} else {
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
}
wifiConfiguration.hiddenSSID = true;
wifiConfiguration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
//config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
wifiConfiguration.priority = 10000;
int networkId = wifiManager.addNetwork(wifiConfiguration);
wifiManager.disconnect();
wifiManager.enableNetwork(networkId, true);
// 连接 WiFi
// wifiManager.reconnect();
这段代码是用于连接到指定的WiFi网络的过程。
首先,创建一个新的WifiConfiguration对象,并设置相应的属性。其中,SSID是WiFi网络的名称,status表示WiFi的状态(这里设置为DISABLED),hiddenSSID表示是否隐藏WiFi网络的SSID,allowedAuthAlgorithms、allowedGroupCiphers和allowedPairwiseCiphers分别表示允许的认证算法、组密码和对称密码。
接下来,判断WiFi网络是否需要密码保护,并且检查密码是否为null。如果需要密码保护并且密码不为null,则设置wifiConfiguration对象的allowedKeyManagement为WPA_PSK,同时设置preSharedKey为密码字符串。否则,设置allowedKeyManagement为NONE。
然后,设置wifiConfiguration的status为ENABLED,并设置networkId为通过wifiManager.addNetwork()方法将wifiConfiguration对象添加到WiFi管理器中,并返回的网络ID。
接下来,断开当前连接的WiFi网络,然后通过wifiManager.enableNetwork(networkId, true)方法启用指定的网络。切记不要将wifiManager.reconnect();加上,否则在连接wifi的时候要等待半天才可以连接上wifi
第二中方法是当targetSDK>28的时候使用,说实话这个方法不是很推荐,因为有很大的弊端,因为Android9以上的API发生改变之后,对于连接wifi有了很大的限制,会造成连接wifi的体验不佳。使用的是官方给的连接方法,不知道这一块的问题到底是Android对wifi的连接进行了限制,还是官方调整的不完全。下面上代码:
NetworkSpecifier specifier =
new WifiNetworkSpecifier.Builder()
.setSsidPattern(new PatternMatcher(ssid, PatternMatcher.PATTERN_PREFIX))
.setWpa2Passphrase(password)
.build();
NetworkRequest request =
new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build();
ConnectivityManager connectivityManager = (ConnectivityManager)
getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
connectivityManager.bindProcessToNetwork(network);
Toast.makeText(holder.itemView.getContext(), "连接成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onUnavailable() {
Toast.makeText(holder.itemView.getContext(), "连接失败", Toast.LENGTH_SHORT).show();
}
};
connectivityManager.requestNetwork(request, networkCallback);
这段代码是用于在 Android 应用中通过指定WiFi网络连接到特定的网络。
首先,创建了一个WifiNetworkSpecifier对象,该对象指定了要连接的WiFi网络的条件。
- setSsidPattern() 方法用于设置WiFi网络的 SSID,可以使用 PatternMatcher 类的 PATTERN_PREFIX 模式进行匹配。这里使用的 ssid 是一个字符串变量。
- setWpa2Passphrase() 方法用于设置连接到WiFi网络所需的 WPA2 密码,这里使用的 password 是一个字符串变量。
接下来,创建了一个NetworkRequest对象,该对象指定了连接网络的请求条件。
- addTransportType() 方法设置仅使用 WiFi 连接类型。
- removeCapability() 方法指定不需要网络连接拥有的 INTERNET 能力。
然后,通过 ConnectivityManager 的 getSystemService() 方法获取 ConnectivityManager 对象。
再创建一个ConnectivityManager.NetworkCallback对象,用于处理网络连接的成功和失败事件。
- onAvailable() 方法在网络可用时被调用,可以在此处进行连接成功后的处理操作。在此代码示例中,将网络与进程绑定,并显示一个连接成功的 Toast 提示。
- onUnavailable() 方法在网络不可用时被调用,可以在此处进行连接失败后的处理操作。在此代码示例中,显示一个连接失败的 Toast 提示。
最后,通过 connectivityManager 的 requestNetwork() 方法向系统请求网络连接,并传入创建的 NetworkRequest 对象和 NetworkCallback 对象,以便处理连接结果。
connectivityManager.bindProcessToNetwork(network);必须添加,否则连接上wifi之后会出现没有网络的情况
最后说一下这个方法的弊端:
1.进行连接时,会自动弹出对应的wifi框去确认是否连接;
2.连接时速度会很慢,没有从系统中连接的快捷
3.连接的wifi网络只能在自身的App中使用
4.退出应用之后wifi自动断开
所以谨慎使用。