强制第三方应用使用Wi-Fi网络

10

我有一个 Android 应用程序和通过 Wi-Fi 可用的服务器。
对于某些操作(例如从服务器流视频),我的应用程序通过共享文件的 URL 使用第三方应用程序。

从 Android L 开始,设备可以同时连接到 Wi-Fi 和蜂窝网络,这会破坏我的应用程序,因为服务器没有互联网,而且 Android 更倾向于使用蜂窝网络(因为它有互联网),因此无法解析 URL。我通过使用 bindProcessToNetwork() 将我的应用程序绑定到 Wi-Fi 来修复这个问题。但是,当应用程序与第三方应用程序共享 URL 时,URL 仍然无法解析,因为第三方应用程序未绑定到 Wi-Fi。

是否有一种方法让第三方应用程序在打开我的应用程序提供的 URL 时使用 Wi-Fi 而不是蜂窝网络?

enter image description here


虽然我没有真正的代码来实现这个,或者说它是否可能,但我会搜索如何在这种情况下操作“路由表”,以便将使用服务器IP的请求设置为使用Wifi作为网关,而其他请求则使用3G。理论上,这将是操作系统级别的效果,因此所有应用程序都将遵循。第二个选项是,在您的应用程序启动时关闭蜂窝数据,我知道这可能有点不好,但警报消息可以很好地通知用户这个操作。 - Yazan
2个回答

0

有很多方法可以实现这个目标...首先我能想到的是创建一个 VPN 应用程序,捕获所有流入和流出设备的流量,并根据需要重新路由,因此即使您的第三方应用程序认为它正在使用蜂窝数据,它的实际 TCP 数据包也可以来自完全不同的地方,甚至是蓝牙。

其次,快速而简单的方法(不确定,没有尝试过,但通过快速的谷歌搜索找到了),进入您的数据使用情况,启用数据截止线(红色和橙色线),无论您将它们设置为什么,但必须启用。接下来向下滚动,您会发现一个列出正在使用数据的应用程序列表,找到您的第三方应用程序,您会发现另一个复选框以限制其后台数据,请勾选它。现在,这个第三方应用程序不能再未经您同意的情况下使用移动数据:只有您自己触发的操作(“前台数据”)才会被执行,没有后台同步或其他后台活动。因此,如果您的应用程序在内部与第三方应用程序共享 URL 并且没有 UI 参与,则应该可以正常工作

如果您只是手动复制并粘贴 URL,那么在手动关闭移动数据时也可以这样做。


0

这里有一个关于如何强制将网络类型指定到特定地址的解释:

如何在Android应用程序中使用3G连接而不是Wi-Fi?

如果您知道第三方服务的URL,可以尝试它。请记住,代码依赖于网络,因此应该在UI线程之外运行。此外,此代码使用了一些已弃用的方法。


我认为这并没有真正解决问题:
  1. 所提出的解决方案强制使用蜂窝网络而不是 Wi-Fi;
  2. 它使用了已弃用的 API(例如 requestRouteToHost());
  3. 它强制 你的 应用程序针对特定主机使用特定网络,但我们正在讨论第三方应用程序。
- surlac
@surlac:1. 是的,你应该将代码更改为http://developer.android.com/reference/android/net/ConnectivityManager.html#TYPE_WIFI.. 2. 我忘记在我的答案中提到它了,会更新。3.正如我所说,如果您知道第三方使用的服务器是什么,可以尝试强制使用该主机。无论如何,我只是在提出一些想法,而不是回答:“不能”。;) - Felipe Duarte
我认为我理解了你的问题,而且我相信,是的,你可以做到你想做的事情。将内部服务器的私有IP地址分配给公共域名。例如,我拥有一个域名(我们称之为elvis.com)。在我的ISP的公共DNS上,我创建了b.elvis.com,并将其指向192.168.1.6,该地址位于我的私有网络中。这有帮助吗? - user4278933

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接