Android不同版本的WiFi连接

        针对于不同版本之间的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自动断开

所以谨慎使用。

        

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值