2

在我的 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)什么方法吗?我敢肯定我一定错过了这里某个地方的帖子......

4

1 回答 1

1

您正在尝试通过仅允许 HTTP/HTTPS 的代理使用SNTP 。您的替代方法是使用一些提供当前时间的 HTTP 服务,这对于大多数用户级应用程序来说已经足够了。

试试http://www.timeapi.org/utc/now,但是如果您使用此服务发布应用程序,您应该检查条款和条件

于 2013-08-08T16:57:28.493 回答