7

我目前正在尝试连接到 wifi 网络。我使用了下面的代码。

        WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
                .setSsid(ssid)
                .setBssid(MacAddress.fromString(bssid))
                .setWpa2Passphrase(password)
                .build();

        NetworkRequest request = new NetworkRequest.Builder()
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                .setNetworkSpecifier(specifier)
                .build();

        ConnectivityManager manager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);

        manager.requestNetwork(request, new ConnectivityManager.NetworkCallback() {

            @Override
            public void onAvailable(@NonNull Network network) {
                ConnectivityManager.setProcessDefaultNetwork(network);
                super.onAvailable(network);
                NetworkInfo info = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                if (info != null && info.isConnectedOrConnecting()) {
                    if (!emitter.isDisposed()) {
                        emitter.onSuccess(true);
                    }
                } else {
                    if (!emitter.isDisposed()) {
                        emitter.onError(new RuntimeException("OS Disconnected"));
                    }
                }

            }

            @Override
            public void onUnavailable() {
                super.onUnavailable();
                if (!emitter.isDisposed()) {
                    emitter.onError(new RuntimeException("Could not connect Wifi"));
                }
            }
        });
    });

问题:上面的代码适用于 Pixel 手机和诺基亚,但在 Oneplus 设备上,我得到 toast连接成功toast,并且在此 wifi 断开连接后立即。wifi 符号在状态栏中非常短暂地可见。在下一刻,Wifi-Symbol 消失了,系统对话框再次可见,连接到 wifi。

已授予以下权限,并授予位置权限,并且在设备中也已启用。

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>

当我调试回调时,它正在通过此顺序中的方法:

  1. onAvailable()
  2. onCapabilitiesChanged()
  3. onBlockedStatusChanged(阻止:假)
  4. onCapabilitiesChanged()
  5. onLost()

我已经提到了这些 Android Q,以编程方式连接到不同的WiFi AP以进行互联网
WiFi网络连接在Android 10(Q)Android Q中不断断开Android Q Wifi网络请求Api连接问题 ,WifiNetworkSpecifier在连接建立后立即失去Wifi

我无法找到解决方案。

网络请求中是否缺少任何导致断开连接的内容。或任何其他赞赏的解决方案。

谢谢你。

4

4 回答 4

2

谈话迟到了,但是,您是否尝试过connectivityManager.bindProcessToNetwork(network)在找到可用网络时拨打电话?

这是我根据您的问题代码的意思的示例:

WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
                .setSsid(ssid)
                .setBssid(MacAddress.fromString(bssid))
                .setWpa2Passphrase(password)
                .build();

        NetworkRequest request = new NetworkRequest.Builder()
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                .setNetworkSpecifier(specifier)
                .build();

        ConnectivityManager manager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);

        manager.requestNetwork(request, new ConnectivityManager.NetworkCallback() {

            @Override
            public void onAvailable(@NonNull Network network) {
                super.onAvailable(network);

                // This is the new line of code
                ConnectivityManager.bindProcessToNetwork(network);

                NetworkInfo info = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                if (info != null && info.isConnectedOrConnecting()) {
                    if (!emitter.isDisposed()) {
                        emitter.onSuccess(true);
                    }
                } else {
                    if (!emitter.isDisposed()) {
                        emitter.onError(new RuntimeException("OS Disconnected"));
                    }
                }

            }
...
}
于 2021-03-04T22:41:23.293 回答
2

截至 2020 年 9 月,此问题似乎仍未在某些设备上得到解决,一加 6、诺基亚手机等似乎正在展示这种成功连接循环。同时,如果您有一个 iOT 设备,您的应用程序正在尝试自动连接并且它失败了,您可以在 onFail() 中尝试此操作,以关闭连接对话框并将您的用户优雅地带到 wifi 页面以手动连接。

        connectivityManager.bindProcessToNetwork(null);
        connectivityManager.unregisterNetworkCallback(networkCallback);
        AlertDialog.Builder alert = new AlertDialog.Builder(...);
        alert.setTitle(...);
        alert.setMessage(...);
        alert.setPositiveButton("OK",
          new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
              Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
              intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              context.startActivity(intent);
            }
          });
        alert.show();
      }
于 2020-09-09T19:16:09.193 回答
1

如果您尝试连接到无法访问互联网的网络,而不是

NetworkRequest request = new NetworkRequest.Builder()
 .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
 .setNetworkSpecifier(specifier)
 .build();

尝试

NetworkRequest request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build()

显然,默认情况下需要互联网功能。

文档(参见https://developer.android.com/reference/android/net/wifi/WifiNetworkSpecifier.Builder#build())说

创建用于请求本地 Wi-Fi 网络的说明符对象。在构建 NetworkRequest 时,应在 NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier) 中使用生成的 NetworkSpecifier。这些说明符只能用于请求本地 wifi 网络(即没有互联网功能)。因此,如果有其他传输(例如蜂窝)可用,设备将不会将其默认路由切换到 wifi。

我不太明白这一段,但它谈到了设备切换回默认路由,什么会导致与目标网络断开连接。

那里提供的示例包括该行

.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)

我复制了这个例子,它对我有用。从未尝试在没有上述线路的情况下建立连接。

但是,我只尝试连接到具有 Internet 连接的网络。令我惊讶的是,当我尝试在没有它的情况下连接到一个时,尽管有文档,但连接失败了。

于 2020-11-16T23:41:54.470 回答
1

我一直在跟踪和研究这个。我的所有发现以及我当前的最佳解决方案都可以在这里找到

但更具体到您的问题是从链接中获取的以下信息

正如Google 此处所述,一些 OEM Rom 没有“保留请求”,因此连接会立即断开。OnePlus 在他们后来的一些型号中解决了这个问题,但不是全部。对于某些 Android 版本上的某些手机型号,此错误将持续存在,因此需要成功的回退(即手动连接且没有网络中断)。没有已知的解决方法可用

  • removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) 不会帮助在 OnePlus 上保持连接,如此处所述

  • 如此处所述,设置 Bssid 无助于保持 OnePlus 上的连接

  • 谷歌帮不上忙,他们说这里不在他们手中

  • OnePlus 论坛帖子确认它在更新后适用于某些型号(但不是全部),请参见此处此处此处

于 2021-01-05T13:05:18.690 回答