在运行时在Android应用程序上路由网络流量

时间:2018-12-18 15:46:51

标签: android network-programming

我们正在实现的应用程序允许用户的手机通过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的条款。

0 个答案:

没有答案