欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android10 NetworkSpecifier 连接WiFi时遇到的诡异问题

程序员文章站 2022-04-14 11:13:54
Android10 NetworkSpecifier 连接WiFi时遇到的诡异问题为了兼容Android 10 Ap配网,使用了最新NetworkSpecifier 连接设备热点AP wifi,在上线灰度后,收到很多客户投诉,很多客户反馈华为手机底部不停重复弹出连接wifi 弹窗,测试后发现问题严重。前期以为华为兼容性问题,在华为官网和论坛请求都没有满意答复。经过了几天的郁闷,突然发现为系统缓存的原因。系统在wifi连接到设备的AP 热点后,大概过了30s,系统启动外网的检测机制,当发现该设备热点wi...

Android10 NetworkSpecifier 连接WiFi时遇到的诡异问题

为了兼容Android 10 Ap配网,使用了最新NetworkSpecifier 连接设备热点AP wifi,在上线灰度后,收到很多客户投诉,很多客户反馈华为手机底部不停重复弹出连接wifi 弹窗,测试后发现问题严重。
前期以为华为兼容性问题,在华为官网和论坛请求都没有满意答复。经过了几天的郁闷,突然发现为系统缓存的原因。
系统在wifi连接到设备的AP 热点后,大概过了30s,系统启动外网的检测机制,当发现该设备热点wifi无外网时,给该设备热点打上一个无外网的标签并且缓存到系统里面。当App调用API主动连接wifi名相同的热点时,系统读取到缓存认为这个wifi无网络,直接强行关闭弹窗,重新弹窗。

解决方案:手动去wifi管理页面,把缓存的相同wifi名删除掉即可

先前考虑过App内主动删除缓存的wifi,鉴于Android 高版本系统权限限制,App内无法删除用户在设置页手动连接的wifi,所以App内主动删除缓存wifi方案废弃了

如果大家有好的方案,欢迎交流

public void wifiConnect()
    {
        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(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                            .setNetworkSpecifier(specifier)
                            .build();
 
            ConnectivityManager connectivityManager = (ConnectivityManager)
                    context.getSystemService(Context.CONNECTIVITY_SERVICE);
 
            ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
                @Override
                public void onAvailable(Network network) {
                    // do success processing here..
                }
 
                @Override
                public void onUnavailable() {
                    // do failure processing here..
                }
            };
            connectivityManager.requestNetwork(request, networkCallback);
            // Release the request when done.
            // connectivityManager.unregisterNetworkCallback(networkCallback);
        }
    }

本文地址:https://blog.csdn.net/bawomingtian123/article/details/108984442