解决Android 10 连接设备热点后无法创建Socket 问题

解决Android 10 连接设备热点后无法创建Socket 问题

在实际工作中,通常的配网方式为设备热点配网,这就需要手机连接上设备热点,App创建socket和设备建立通信。在工作中发现,将target 设置成29 时,无法创建socket。这里小编就提供一种解决方案

NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
                    .setSsidPattern(new PatternMatcher(wifiName, PatternMatcher.PATTERN_PREFIX))
                    .setWpa2Passphrase(wifiPwd)
                    .setIsHiddenSsid(false)
                    .build();
            NetworkRequest request =
                    new NetworkRequest.Builder()
                            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                            .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                            .setNetworkSpecifier(specifier)
                            .build();

            connectivityManager = (ConnectivityManager)
                    context.getSystemService(Context.CONNECTIVITY_SERVICE);
            if (networkCallback == null) {
                networkCallback = new ConnectivityManager.NetworkCallback() {
                    @Override
                    public void onAvailable(Network network) {
                        // do success processing here..
                        NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
                        boolean isCapWifi = capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
                        if (isCapWifi) {
                            ApTcpClient.getInstance().newSocket();
                            try {
                                network.bindSocket(ApTcpClient.getInstance().socket);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                connectivityManager.bindProcessToNetwork(network);
                            } else {
                                ConnectivityManager.setProcessDefaultNetwork(network);
                            }

                        }
                    }

                    @Override
                    public void onUnavailable() {
                        // do failure processing here..
                    }
                };
            }
            connectivityManager.requestNetwork(request, networkCallback);

这里着重是这一行
network.bindSocket(ApTcpClient.getInstance().socket);
查看bindSocket源码可以得知,想要和设备热点建立通信必须先绑定

    /**
     * Binds the specified {@link Socket} to this {@code Network}. All data traffic on the socket
     * will be sent on this {@code Network}, irrespective of any process-wide network binding set by
     * {@link ConnectivityManager#bindProcessToNetwork}. The socket must not be connected.
     */
    public void bindSocket(Socket socket) throws IOException {
        // Query a property of the underlying socket to ensure that the socket's file descriptor
        // exists, is available to bind to a network and is not closed.
        socket.getReuseAddress();
        bindSocket(socket.getFileDescriptor$());
    }

只有绑定了socket后,才能创建。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值