android – 在应用程序中使用多个网络接口

前端之家收集整理的这篇文章主要介绍了android – 在应用程序中使用多个网络接口前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个通过WiFi触发索尼qx智能手机相机的应用程序.然而,我需要将图像从手机上传输到另一个本地网络上.由于wifi卡正在用于qx连接,因此我需要能够使用以太网将USB传输到手机上. Http请求将用于触发相机并将图像从手机中发送出去.

是否可能在一个Android应用程序的电话上有两个网络接口设置来指定某些http请求使用一个网络接口和其他人使用另一个网络接口?这是否需要通过路由表完成,而不是java?

我正在使用的手机是一个rooted nexus 6p.

更新:

目前,我能够使用以太网适配器(Nexus 6P).设备通过以太网连接到本地网络.当Wi-Fi接口关闭时,我可以ping通设备通过以太网连接的本地网络上的所有设备.但是,我无法访问该网络上的任何设备(我知道它们正在运行)的Web服务器(不使用DNS),即通过浏览器应用程序进行Http. nexus 6p通过Ubiquiti Station通过以太网连接到网络.这似乎是路由问题.

我可以使用系统(usb接口)并在一个应用程序中使用Wi-Fi,这使我相信可以使用以太网和Wi-Fi.

UPDATE2:

经过更多的测试,似乎是一个权限问题.由于当我ping通网络时,设备通过以太网连接,而不在终端中首先运行su,网络不存在.但是,当我运行su然后ping,我可以ping网络.因此,我的应用程序似乎需要在访问以太网之前获得超级用户权限.我已经授予超级用户访问权限,但没有任何改变.我读到,只是运行su是不够的从这个post评论之一.这是因为su只是产生一个根shell死亡.这也解释了为什么我无法通过浏览器应用访问此网络上的任何Web服务器.在进行HTTP调用(如给予HttpURLConnection root访问)时,是否可以授予我的应用程序访问以太网接口的权限,如果这样做有意义(运行su不起作用)?似乎肯定有一个解决方案,因为HttpURLConnection可以通过USB tethering接口(Nexus 6P称它为rndis0)通话.

更新3:

我发现在线here,我可以让我的应用程序是一个系统应用程序(认为这可能授予应用程序eth0访问权限).我刚刚将我的应用程序移动到/ system / app,然后重新启动.然而,这似乎没有给应用程序更多的权限(因此不能解决问题),或者还有一些其他的需要,使应用程序系统,而不是将其复制到/ system / app.

更新4:

所以我可以让以太网工作在每个应用程序没有root权限!似乎它只适用于DHCP,不喜欢静态连接,我正在使用它.它可以启用Wi-Fi,但是,当启用以太网时,我无法联系Wi-Fi网络上的任何设备.有没有解决的办法?它是否与设置两个默认网关有关?

解决方法

由于您是在Nexus 6P中进行编程,您可以尝试使用ConnectivityManager中添加的新API来选择以太网作为您的流程的首选网络连接.

既然我不能像你这样建立类似的环境,我不知道它是否有效.这只是一个建议的解决方案,完全没有测试和验证.

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
Network etherNetwork = null;
for (Network network : connectivityManager.getAllNetworks()) {
    NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
    if (networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {
        etherNetwork = network;
    }
}
Network boundNetwork = connectivityManager.getBoundNetworkForProcess();
if (boundNetwork != null) {
    NetworkInfo boundNetworkInfo = connectivityManager.getNetworkInfo(boundNetwork);
    if (boundNetworkInfo.getType() != ConnectivityManager.TYPE_ETHERNET) {
        if (etherNetwork != null) {
            connectivityManager.bindProcessToNetwork(etherNetwork);
        }
    }
}

猜你在找的Android相关文章