android - 在应用程序中使用多个网络接口(interface)

标签 android network-programming

我写了一个应用程序,它通过 wifi 触发索尼 qx 智能手机连接相机。但是,我需要通过另一个本地网络实时传输手机上的图像。由于 wifi 卡用于 qx 连接,我需要能够通过 usb 使用以太网来从手机传输图像。 Http 请求将用于触发相机并从手机发送图像。

是否可以在具有两个网络接口(interface)设置的手机上的一个 android 应用程序中指定某些 http 请求使用一个网络接口(interface)而其他请求使用另一个网络接口(interface)?这是否需要通过路由表而不是 java 来完成?

我使用的手机是 root 的 nexus 6p。

更新:

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

我可以在一个应用程序中连接(USB 接口(interface))和使用 Wi-Fi,这让我相信可以同时使用以太网和 Wi-Fi。

更新2:

经过多方测试,似乎是权限问题。因为当我 ping 网络时设备通过以太网连接到没有首先在终端中运行 su 网络不存在。但是,当我运行 su 然后 ping 时,我可以 ping 网络。因此,我的应用程序似乎需要在访问以太网之前获得 super 用户许可。我已经授予它 super 用户访问权限,但没有任何改变。我从 post 中的一条评论中了解到,仅运行 su 是不够的.这是因为 su 只是生成了一个死掉的 root shell。这也解释了为什么我无法通过浏览器应用程序访问该网络上的任何网络服务器。是否可以在进行 HTTP 调用时授予我的应用程序访问以太网接口(interface)的权限,例如 give HttpURLConnection 根访问权限,如果这有意义(运行 su 不起作用)?似乎肯定有解决方案,因为 HttpURLConnection 可以通过 USB 网络共享接口(interface)(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 - 在应用程序中使用多个网络接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37715525/

相关文章:

javascript - 清除phonegap中的cookie/禁用phonegap使用cookie

android - 第一次禁用软键盘上的 0 键

android - 为 Flutter 中的选项卡添加底部边框

c++ - 如何在不破坏连接的情况下发送和接收 SO_SNDTIMEO 和 SO_RCVTIMEO 的数据?

network-programming - UDP sendto() 何时阻塞?

java - 从文件中快速读取小端整数

android - 如何阻止图像在 Android 应用程序的 gridview 中移动位置

android - 一段时间后 UDP 传输停止

linux - 当非阻塞服务器套接字上收到新请求时,为什么进程不从 sleep() 恢复?

c++ - WinDivert 问题