我的应用程序用于HttpURLConnection
连接到我的 REST 服务。我记录了错误并注意到偶尔发生的是用户获取的 WiFi 连接但它有代理。
例如,那些将您重定向到支付页面然后让您使用互联网的机场 wifi。我的代码不遵循重定向。
我真正想要的是忽略 WiFi 的存在并强制通过 3G/4G/E 进行通信。我怎么能在安卓上做到这一点?
一旦您检测到代理,就会弹出一个对话框,告诉用户您的应用无法使用该网络,因此您正在切换到移动网络。您可以使用类切换到移动网络ConnectivityManager
。
ConnectivityManager cm;
cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
完成后切换回默认值:
cm.setNetworkPreference(ConnectivityManager.DEFAULT_NETWORK_PREFERENCE);
使用以下代码段检测代理
HttpURLConnection conn;
...
if (conn.getResponseCode() == HTTP_PROXY_AUTH){
// You got a '407: Proxy authentication required' response.
// Set the networkPreference() here and retry when
// network connection changes to TYPE_MOBILE.
}
您可以查看这篇文章以了解如何通过代理使用 HttpURLConnection:如何使 HttpURLConnection 使用代理?
要了解如何检测“网络变化”,请参阅这篇文章: Android,如何在轮询数据时处理网络变化(从 GPRS 到 Wi-fi,反之亦然)
如果您无法显示对话框,至少发送一个状态栏Notification
,以便用户稍后了解网络切换。
在您的活动中,每当您尝试调用您的 Web 服务时
如果启用了,只需禁用 WIFI 即可。互联网上会有很多这样的代码片段
现在还要检查移动数据网络是否可用,如果可用,请拨打您的电话,否则向用户显示一个对话框,该应用程序将需要移动数据网络来执行任务。
一旦你完成你的 HTTP 调用,再次打开 WIFI。