【问题标题】:Android Q 10 Connect to network WifiNetworkSpecifierAndroid Q 10 连接网络 WifiNetworkSpecifier
【发布时间】:2020-01-15 16:45:09
【问题描述】:

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

【问题讨论】:

  • 嘿,你有办法解决这个问题吗?每当我使用 NetworkSpecifier 时,它都会显示我“已连接”到网络,但我没有实际的互联网连接。
  • 嘿,对于我的用例,我跳到了@AmirZ 发布的 WifiNetworkSuggestionBuilder。如果您想使用 WifiNetworkSpecifier 连接到普通的 WifiNetwork,您似乎只能访问此应用的互联网功能。所以你不会有其他应用程序的互联网,例如 Chrome
  • 啊,听着真令人失望。谢谢你!
  • 我尽一切努力只用我的应用程序上网,但无论如何我都无法上网。看到弹出窗口后,我可以连接到 wifi,但即使在我的应用程序中也无法连接到互联网。

标签: android connection wifi android-10.0


【解决方案1】:

聚会有点晚了,但也许它会帮助遇到这个问题的其他人。

看来你是对的。 在android Q中,一旦应用被杀死,系统会自动断开我们通过WifiNetworkSpecifier连接的WiFi网络,并且无法阻止系统这样做。

我想出的最佳解决方案是将 WifiNetworkSpecifier 与 WifiNetworkSuggestion 结合使用。这允许我们在使用我们的应用程序时使用 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
    }

干杯,

【讨论】:

  • 此方案在手机未连接到其他网络时有效。
  • @AmirZ 但是用户是否必须确认建议,或者一旦应用程序被终止,系统是否会自动连接到建议的网络?
  • 据我所知,在没有任何用户交互的情况下,无法将用户连接到 android Q 上的 wifi 网络。此外,如果用户手动断开您的网络,您的网络将在接下来的 24 小时内被列入黑名单,这意味着您将无法在此期间再次建议该网络(用户当然可以手动连接到您的网络,如果他选择)。
【解决方案2】:

我试过这段代码,它工作正常

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 中进行 normak 浏览
  • @JulianSchweppe 是的,如果我们的 WiFi 关闭,我们无法在应用程序外使用互联网,即使我们无法连接到互联网,我们也无法以编程方式打开 WiFi
  • 我什至无法在我的应用程序中使用互联网。在角落显示带有“x”的 wifi 图标。
  • @KBog 你找到解决办法了吗?
  • @R.singh 我最终坚持使用 API 28,它让应用程序可以更好地控制 wifi。希望能争取一些时间,直到通过更新的更新情况变得更好。这对我来说只是时间问题……
【解决方案3】:

您必须添加此行才能使用互联网。 networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 2020-05-15
    • 2020-06-24
    • 2023-03-06
    • 2014-08-12
    • 2021-03-21
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多