【问题标题】:Send data through wifi (no internet) when mobile data on开启移动数据时通过 wifi(无互联网)发送数据
【发布时间】:2016-05-11 04:42:15
【问题描述】:

我正在开发和应用程序,它通过 wifi(由设备生成)连接到硬件设备并通过套接字连接向它发送数据。 问题是,当激活移动数据(3G/4G)时,android 会尝试通过它发送数据,而不是通过设备生成的 wifi 发送数据,因为 wifi 没有互联网连接。 我正在考虑使用ConnectivityManager#setNetworkPreference(),但它已在 api 21 中被弃用。

如何设置它使用设备生成的wifi而不是移动数据接口发送数据?

【问题讨论】:

    标签: android sockets android-wifi android-networking network-interface


    【解决方案1】:

    setProcessDefaultNetwork 到 wifi 后网络会切换回移动端,不能通过这种方式发送大数据,因为这样创建的所有 socket 都会停止工作。目前还没有找到完美的方法,这里仅供参考。

    1.如果你能获得root访问权限,请在连接wifi之前这样做:

    Process process = runtime.exec("su");
    DataOutputStream dataOutputStream = new DataOutputStream(process.getOutputStream());
    dataOutputStream.writeBytes("settings put global captive_portal_server 127.0.0.1\n");
    dataOutputStream.writeBytes("exit\n");
    dataOutputStream.flush();
    int status = process.waitFor();
    

    发送数据后删除:

    dataOutputStream.writeBytes("settings delete global captive_portal_server\n");
    

    2.如果你可以获得 WRITE_SECURE_SETTINGS 权限:

    Settings.Global.putString(getContentResolver(),"captive_portal_server","127.0.0.1");
    

    或者:

    Settings.Global.putInt(getContentResolver(),"captive_portal_detection_enabled",0);
    

    【讨论】:

    • 嗨@MADAO,谢谢你的回答,我想你也是正确的。我已经找到了答案,忘记在这里更新问题了。
    【解决方案2】:

    经过大量研究和时间尝试了解这一切后,我发现这在 Android 5.0 (Lollipop) 之前的版本中是不可能的,操作系统一次只保持一个网络接口,而应用程序不会'无法控制。

    所以要在大于或等于 Lollipop 的版本上执行此操作,我执行了以下操作:

    1. 在进行套接字连接之前,请检查 android 是否大于或等于 Lollipop,以防不是您只需正常执行您必须执行的操作即可;
    2. 如果版本等于或大于 Lollipop,您需要执行以下操作:

      if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
          final ConnectivityManager manager = (ConnectivityManager) context
                  .getSystemService(Context.CONNECTIVITY_SERVICE);
          NetworkRequest.Builder builder;
          builder = new NetworkRequest.Builder();
          //set the transport type do WIFI
          builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
          manager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
              @Override
              public void onAvailable(Network network) {
                  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                      manager.bindProcessToNetwork(network);
                  } else {
                      //This method was deprecated in API level 23
                      ConnectivityManager.setProcessDefaultNetwork(network);
                  }
                  try {
                      //do a callback or something else to alert your code that it's ok to send the message through socket now
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  manager.unregisterNetworkCallback(this);
              }
          });
      }
      
    3. 完成后,您应该停止使用此绑定进程:

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
          ConnectivityManager manager = (ConnectivityManager) InovePlugApplication.getContext()
                  .getSystemService(Context.CONNECTIVITY_SERVICE);
          manager.bindProcessToNetwork(null);
      } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
          ConnectivityManager.setProcessDefaultNetwork(null);
      }
      

    这个答案帮助我理解了如何做到这一点https://stackoverflow.com/a/29837637/2550932

    【讨论】:

    • 您需要在清单中添加<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 才能使其正常工作。
    • @hygorxaraujo 我正在使用您的代码,但这不适用于 android nougat。我正在为 Marshamallow 及更高版本执行 manager.bindProcessToNetwork(network)。有什么解决办法吗?
    • @satpal002 抱歉,我只在 Android Marshmallow 之前使用过这段代码(而且我没有带有 Nougat 的设备来测试它)。我没有注意到 API 中的任何更改使其停止工作developer.android.com/reference/android/net/…。它在以前的版本(棒棒糖以上)中是否正常工作?
    • 是的,它在 marshamallow 中运行良好,但在牛轧糖上:我正在向 ip 发送套接字消息,然后它给出了网络无法访问的异​​常(移动数据已打开,并且设备也是连接到 wifi,并且该 ip 在同一个 wifi 网络上可用)。
    猜你喜欢
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    相关资源
    最近更新 更多