Android Q 10如何连接到网络WifiNetworkSpecifier?

12
由于Android Q不允许WifiManager添加网络,他们建议使用WifiNetworkSpecifier代替。通过WifiNetworkSuggestionBuilder,我已经能够在状态栏上显示通知,让用户加入网络。但是这个API不能满足我的需求,因为我不想让用户必须使用状态栏中的建议。
通过WifiNetworkSpecifier,我也已经能够显示有关加入网络的弹出窗口,并且应用程序还建立了与应用程序的连接。但是该wifi连接似乎仅在应用程序的范围内可用。如何才能克服应用程序的范围,以便其他应用程序和例如浏览器也能够使用这个新建立的连接? 以下是我的代码
    WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
    builder.setSsid("abcdefgh");
    builder.setWpa2Passphrase("1234567890");

    WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();
    NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);     
networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);            
networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED);            
networkRequestBuilder.setNetworkSpecifier(wifiNetworkSpecifier);
NetworkRequest networkRequest = networkRequestBuilder.build();
    ConnectivityManager cm = (ConnectivityManager) App.getInstance().getBaseContext().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm != null) {
        cm.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(@NonNull Network network) {
                //Use this network object to Send request.
                //eg - Using OkHttp library to create a service request

                super.onAvailable(network);
            }
        });

3
嘿,你有没有找到解决办法?每当我使用NetworkSpecifier时,它会显示我已“连接”到网络,但我实际上无法上网。 - Russell C.
嘿,针对我的使用情况,我跳到了WifiNetworkSuggestionBuilder,就像@AmirZ发布的那样。如果您想使用WifiNetworkSpecifier连接普通WifiNetwork,则似乎只能访问此应用程序的Internet功能。因此,您将无法为其他应用程序提供Internet,例如Chrome。 - Julian Schweppe
啊,听到这个很失望。不过还是谢谢! - Russell C.
我尝试了一切办法只使用我的应用程序获取互联网连接,但是无论我尝试什么都无法获得互联网连接。我可以在看到弹出窗口后连接到wifi,但是即使在我的应用程序中也无法上网。 - KBog
3个回答

5

来晚了,但也许会对其他遇到这个问题的人有所帮助。

看起来你是正确的。在Android Q中,一旦应用程序被杀死,系统就会自动断开我们通过WifiNetworkSpecifier连接的WiFi网络,并且没有办法防止系统这样做。

我想到的最好的解决方案是使用WifiNetworkSuggestion的WifiNetworkSpecifier。这使我们可以在使用我们的应用程序时使用WifiNetworkSpecifier,并建议一些wifi网络供系统在由于应用程序被终止而断开我们的WiFi时自动连接。

这里有一些示例代码:

    WifiNetworkSuggestion.Builder builder = new WifiNetworkSuggestion.Builder()
        .setSsid("YOUR_SSID")
        .setWpa2Passphrase("YOUR_PASSWORD")
    WifiNetworkSuggestion suggestion = builder.build();

    ArrayList<WifiNetworkSuggestion> list = new ArrayList<>();
    list.add(suggestion);

    WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    int status = manager.addNetworkSuggestions(list);

    if (status == STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
        //We have successfully added our wifi for the system to consider
    }

祝好!


2
当手机未连接到其他网络时,此解决方案可行。 - Sam
@AmirZ 但是用户是否需要确认建议,还是一旦应用程序被关闭,系统就会自动连接到建议的网络? - Julian Schweppe
1
据我所知,在Android Q上没有办法在没有用户交互的情况下将用户连接到WiFi网络。此外,如果用户手动断开了您的网络连接,您的网络将被列入黑名单,意味着在接下来的24小时内您将无法再次建议该网络(当然,如果用户选择,他仍然可以手动连接到您的网络)。 - AmirZ

4
我已经完成了翻译,请查看以下结果:

我尝试过这段代码,它运行良好。

WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
builder.setSsid("abcdefgh");
builder.setWpa2Passphrase("1234567890");

WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();
NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);     
networkRequestBuilder.setNetworkSpecifier(wifiNetworkSpecifier);
NetworkRequest networkRequest = networkRequestBuilder.build();
ConnectivityManager cm = (ConnectivityManager) 
           App.getInstance().getBaseContext().getApplicationContext()
          .getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm != null) {
    cm.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(@NonNull Network network) {
           super.onAvailable(network);
    cm.bindProcessToNetwork(network)
        }});

但是你不能在应用程序外使用这个互联网连接,对吧?例如在 Chrome 中进行正常浏览。 - Julian Schweppe
1
@JulianSchweppe 是的,即使我们无法连接到互联网,如果我们的WiFi关闭了,我们也不能在应用程序外部使用互联网,我们无法通过编程打开WiFi。 - Waleed
1
我甚至无法在我的应用程序中使用互联网。显示带有角落处的“x”的WiFi图标。 - KBog
@KBog,你找到任何解决方案了吗? - R.singh
1
@R.singh 我最终选择了API 28,这可以让应用程序在wifi方面具有更多的控制权。希望在更新更好之前多争取一些时间。对我来说只是时间问题... - KBog
@Waleed,你能帮我解决如何在OkHttpClient中添加网络请求吗? - MARSH

0
你必须添加这行代码才能使用互联网。
networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接