2013-08-07 36 views
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)方法嗎?我確信我一定在這裏錯過了一個帖子...

+0

您的代理可能只允許HTTP/HTTPS連接 –

+0

嗯,聽起來很正確,所以你說我沒有通過http連接?我將如何解決這個問題? Thx – avalancha

+0

WebTimeSntpClient:Sntp!= HTTP –

回答

1

您正試圖使用​​SNTP通過代理,只允許HTTP/HTTPS。 您的替代方案是使用一些提供當前時間的HTTP服務,這對大多數用戶級應用程序來說已經足夠了。

http://www.timeapi.org/utc/now一試,但如果你正在使用這項服務,你應該檢查條款和條件發佈應用程序。