Android:如何为特定主机使用Wifi网络,但手机使用移动网络用于其他所有主机

Pau*_*son 22 mobile networking android

我正在开发一个移动应用程序(iOS和Android)来通过Wi-Fi控制设备.设备会创建无线网络(SoftAP),但不提供对Internet的访问.

在iOS上,我可以连接到设备并向其IP地址(192.168.70.1)发出请求,但所有其他请求都会回退到移动网络.这允许手机在通过Wi-Fi连接到设备时保持互联网连接.

在Android上,如果我连接到设备无线网络,互联网请求不会回退到移动连接,它们就会失败.

在我的Android应用中,我可以ConnectivityManager.requestRouteToHost用来强制我应用的请求使用移动网络.但是,其他应用程序发出的请求仍然使用设备wifi网络并失败.

我还试图用以下方法ConnectivityManager来改变网络偏好:

ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE)

这会导致手机使用移动网络来处理来自所有应用程序的所有请求.Wi-Fi已禁用.似乎在Android的早期版本中,即使它不是"首选"网络,仍然可以使用Wi-Fi,但这似乎在KitKat中不起作用.这可能与Android 4.2中的更改有关:https://code.google.com/p/android/issues/detail? id = 73509"自4.2以来ConnectivityManager断开了不属于NetworkPreference的网络"

是否有解决方案允许Android应用程序将Wi-Fi用于特定IP地址,移动网络用于其他所有内容?也许这可以通过NDK完成?

Rob*_*erg 10

实际上你可以,但仅限于Lollipop(API 21).

从Android API 21文档:

    Android 5.0 provides new multi-networking APIs that let your app dynamically scan for available
networks with specific capabilities, and establish a connection to them. This functionality is useful
when your app requires a specialized network, such as an SUPL, MMS, or carrier-billing network, or if
you want to send data using a particular type of transport protocol.
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用NetworkRequest.Builder类创建通过特定传输类型发送请求的NetworkRequest.

使用以下功能:

NetworkRequest.Builder addTransportType(int transportType)
Run Code Online (Sandbox Code Playgroud)

为您的请求设置传输类型(例如WIFI,ETHERNETCELLULAR).

  • 希望是在请求wifi网络之后,setNetworkPreference()会将设备的其余部分切换到移动网络,并将wifi网络保留在原位. (2认同)

小智 3

Android 通常会删除不属于网络偏好的网络。您可以使用的解决方法是通过移动应用程序创建一个 AP 并让设备连接到它。这样,移动设备就可以保持互联网连接并与设备进行通信。

实施细节请参考以下链接:

https://github.com/opengarden/android-tether

https://code.google.com/p/android-wifi-tether/