我们正在实现的应用程序允许用户的手机通过WiFi连接到网络,而无需访问Internet(通过该网络),并同时使用手机的移动数据连接。该应用程序将通过它所连接的网络访问Web服务,同时还能通过数据计划访问其网络外部的其他服务。这样做的行为不符合预期;它可在iOS上运行,但在Android上不可用,因此我开发了一种方法来手动路由离开我的应用程序的网络流量。
我当前的解决方法仅限于Android 6.0版(Api 23)及更高版本。我所做的是通过ConnectivityManager的网络请求api手动分配流量应流向的位置:
NetworkRequest request = new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
//.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) //In case it should go through WiFi instead
.build();
connectivityManager.requestNetwork(request, new ConnectivityManager.NetworkCallback(){
@Override
public void onAvailable(Network network) {
connectivityManager.bindProcessToNetwork(network);
//Handle API Request
}
@Override
public void onUnavailable() {
//Handle error logic
}
});
尽管这可能不切实际,但我已经做到了这一点,并且我可以更改应该通过哪个网络发送请求。但是,由于该应用程序处于打开状态且没有重点关注,因此其他应用程序可以通过手机的数据计划访问互联网。关闭应用程序后,行为将恢复正常,并且手机可以通过网络(而不是网络)访问服务(反之亦然,具体取决于您的Android手机)。
我想知道是否有一种方法可以在应用程序不集中时(即在我的活动的onPause()期间)恢复到正常行为。手动为其他应用程序设置路由可能不适合最终用户体验,也不能通过Google的条款。