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

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);
        }
    }

你可能感兴趣的:(android)