在我的Android应用程序中,我需要连接到互联网以检查时间。此代码段在移动网络和WiFi网络中运行良好,没有启用代理:
public class MyTimeGetterTask {
@Override
protected Long doInBackground(Void... params) {
WebTimeSntpClient client = new WebTimeSntpClient();
if (client.requestTime("time-d.nist.gov", 3000)) {
long now = client.getNtpTime() + SystemClock.elapsedRealtime()
- client.getNtpTimeReference();
return now;
}
else {
return null;
}
}
}
WebTimeSntpClient的核心元素如下:
public class WebTimeSntpClient {
public boolean requestTime(String host, int timeout) {
DatagramSocket socket = null;
try {
socket = new DatagramSocket();
socket.setSoTimeout(timeout);
InetAddress address = InetAddress.getByName(host);
byte[] buffer = new byte[NTP_PACKET_SIZE];
DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT);
...
socket.send(request);
DatagramPacket response = new DatagramPacket(buffer, buffer.length);
socket.receive(response);
...
} catch (IOException ex) {
return false;
} finally {
if (socket != null) {
socket.close();
}
}
return true;
}
}
然而,当我在办公室时,WiFi要求我配置一个代理(我在设置中通过长按网络,然后点击“修改网络” - 从Android API级别17开始)连接失败。
现在我已经在互联网上找到了很多关于代理的非常好的帖子,特别是在SO上,但绝对没有人能回答这个(对我来说)非常简单的问题:
如何强制我的应用程序使用已在设置中配置的代理?
相反,他们专注于更高级的问题,如:
再次说明:我想强调,这不是不是我的意图,我只是希望我的应用程序连接到互联网,无论如何。有一些System.useWifiProxyIfAvailable(true)
方法吗?我确定我一定错过了某处的帖子......
答案 0 :(得分:1)
您尝试通过仅允许HTTP / HTTPS的代理使用SNTP。 您可以选择使用一些提供当前时间的HTTP服务,这对于大多数用户级应用程序来说已经足够了。
尝试 http://www.timeapi.org/utc/now ,但如果您要使用此服务发布应用程序,则应检查条款和条件。