300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Android 10自动连接WiFi问题 Android 10 断开WiFi问题

Android 10自动连接WiFi问题 Android 10 断开WiFi问题

时间:2022-02-03 11:03:57

相关推荐

Android 10自动连接WiFi问题 Android 10 断开WiFi问题

说明:本文主要说明扫码之后自动连接WiFi的一些处理,扫码的流程相对简单,网上教程也比较多,对于目前Android各个版本也没有太多变化。问题描述:最近在做项目的时候,发现以前的项目有扫描二维码自动连接WiFi的功能,设备改了生成二维码的方式,然后发现手机无法自动连接WiFi了。问题原因:经过代码调试发现:(我都是真机调试)

wifiManager.addNetwork(WifiConfiguration);

在添加WiFi的时候,这行代码始终返回-1,换用同事手机竟然神奇的可以连接,然后一脸蒙蔽,裂开了,不怕有问题,就怕有的有问题,有的没问题。问题解决:区别:我测试手机小米10androidQ(andorid 10)的系统,同事手机荣耀androidP的系统,大胆猜测是不是android 10又搞了什么奇怪的东西根因:皇天不负有心人,上代码:

/*** Add a new network description to the set of configured networks.* The {@code networkId} field of the supplied configuration object* is ignored.* <p/>* The new network will be marked DISABLED by default. To enable it,* called {@link #enableNetwork}.** @param config the set of variables that describe the configuration,* contained in a {@link WifiConfiguration} object.* If the {@link WifiConfiguration} has an Http Proxy set* the calling app must be System, or be provisioned as the Profile or Device Owner.* @return the ID of the newly created network description. This is used in* other operations to specified the network to be acted upon.* Returns {@code -1} on failure.** @deprecated* a) See {@link WifiNetworkSpecifier.Builder#build()} for new* mechanism to trigger connection to a Wi-Fi network.* b) See {@link #addNetworkSuggestions(List)},* {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration* when auto-connecting to wifi.* <b>Compatibility Note:</b> For applications targeting* {@link android.os.Build.VERSION_CODES#Q} or above, this API will always return {@code -1}.*/@Deprecatedpublic int addNetwork(WifiConfiguration config) {if (config == null) {return -1;}workId = -1;return addOrUpdateNetwork(config);}

这是WifiManager.class中addNetwork方法的描述,注意注释中最后一行

{@link android.os.Build.VERSION_CODES#Q} or above, this API will always return {@code -1}.

androidQ或者更高的版本,这个方法始终返回-1,至此问题原因分析完毕,接下来开始解决:官网一顿操作:Android 10的新方案如下连接:https://developer./guide/topics/connectivity/wifi-bootstrap

代码如下:

public void test(){if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q){NetworkSpecifier specifier =new WifiNetworkSpecifier.Builder().setSsidPattern(new PatternMatcher("此处WiFi名称", PatternMatcher.PATTERN_PREFIX)).setWpa2Passphrase("此处WiFi密码").build();NetworkRequest request =new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).removeCapability(_CAPABILITY_INTERNET).setNetworkSpecifier(specifier).build();ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);workCallback networkCallback = new workCallback() {@Overridepublic void onAvailable(Network network) {// do success processing here..}@Overridepublic void onUnavailable() {// do failure processing here..}};connectivityManager.requestNetwork(request, networkCallback);// Release the request when done.// connectivityManager.unregisterNetworkCallback(networkCallback);}}

注:我用的是WPA的加密模式,亲测可用。至此完结,撒花。

更新说明:项目使用WiFi和设备传输数据,Android Q会在调用如下方法后弹出提示框,提示用户连接WiFi,如果用户连接成功,则会进入回调成功的方法中,如果用户取消或者连接失败,则会进入回调中的失败方法,里面的逻辑自行处理。

//Android 10 自动连接WiFi方案public void testWifi(String ssid,String psw){if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q){NetworkSpecifier specifier =new WifiNetworkSpecifier.Builder().setSsidPattern(new PatternMatcher(ssid, PatternMatcher.PATTERN_PREFIX)).setWpa2Passphrase(psw).build();NetworkRequest request =new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).removeCapability(_CAPABILITY_INTERNET).setNetworkSpecifier(specifier).build();ConnectivityManager connectivityManager = (ConnectivityManager)getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);// WiFi连接回调workCallback networkCallback = new workCallback() {//WiFi连接成功@Overridepublic void onAvailable(Network network) {// do success processing here.//如果WiFi连接成功,下面的代码表示使用该wifi网络connectivityManager.bindProcessToNetwork(network);}//WiFi连接失败@Overridepublic void onUnavailable() {// do failure processing here..}};connectivityManager.requestNetwork(request, networkCallback);}}

1.如何使用已经连接的WiFi

在WiFi连接成功后一定要connectivityManager.bindProcessToNetwork(network);表示使用该wifi网络;

由于项目中仅仅是使用Wifi和设备间传输数据,传输数据完成后设备会关闭WiFi。

此时APP使用的依然是该WiFi网络;如果要断开该网络,仅仅使用wifiUtils.forgetNetwork()只是断开了WiFi,手机依然使用的是WiFi网络。

要不在使用该WiFi,则需要:connectivityManager.bindProcessToNetwork(null);表示不在使用该网络。

AndroidQ这边也是项目需求最近才在研究,大家可以互相探讨。大家可以借鉴。

2.Android 10以及以上如何断开WiFi

在升级完成之后,我们要断开与设备之间的WiFi连接

使用如下:

connectivityManager.unregisterNetworkCallback(networkCallback);

注意上面为android 10及以上的处理,android 10以下需要判断

if(networkCallback != null){connectivityManager.unregisterNetworkCallback(networkCallback);}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。