2015-06-30 3 views
2

В моем приложении я хочу использовать Время сети, а не время устройства. Требование моего приложения заключается в том, что время должно быть правильным.Как получить время из сети в Android

Я пытаюсь получить время от Сервер NTS, но загрузчик продолжает работать и не останавливается. Я ждал более 30 минут, но все равно ничего не получаю.

Я хочу знать, есть ли какой-либо другой метод для получения из сети, потому что я не хочу, чтобы время от сети занимало так много времени.

public class MainActivity extends Activity { 

public static final String TIME_SERVER = "time-a.nist.gov"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button btnGetTime = (Button)findViewById(R.id.button1); 

    btnGetTime.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // Perform action on click 
       new GetTimeFromNetwork().execute(); 
     } 
    }); 

    } 

public class GetTimeFromNetwork extends AsyncTask<String, Void, String> { 

    ProgressDialog progressDialog; 

    @Override 
    protected void onPreExecute() { 

     progressDialog = new ProgressDialog(MainActivity.this); 
     progressDialog.setMessage("Loading..."); 
     progressDialog.setCancelable(false); 
     progressDialog.show(); 
     Log.i("pre execute","yes"); 

    } 


    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
    Log.i("In Get time From Server class", "yes"); 

      try { 
       NTPUDPClient timeClient = new NTPUDPClient(); 
       InetAddress inetAddress = InetAddress.getByName(TIME_SERVER); 
       TimeInfo timeInfo = timeClient.getTime(inetAddress); 
       //long returnTime = timeInfo.getReturnTime(); //local device time 
       long returnTime = timeInfo.getMessage().getTransmitTimeStamp() 
         .getTime(); //server time 
       Date time = new Date(returnTime); 
       Log.i("time", "Time from " + TIME_SERVER + ": " + time); 
      } catch (Exception e) { 
       // TODO: handle exception 
       Log.e("error",e.getMessage()); 
     } 
       return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     progressDialog.dismiss(); 

    } } 
} 
+0

Вы получаете что-то в Log.i ("время", "Время от" + TIME_SERVER + ":" + время); – Pavya

+0

Нет, я ничего не получил. – Andrain

+0

попробуйте использовать другой сервер времени – Pavya

ответ

5

Это решение работает для меня:

Импорт в вашем модуле Gradle эту зависимость (возможно, у вас уже есть):

compile 'commons-net:commons-net:3.3' 

Здесь вы образец получают местную/сеть время. Как вы знаете, вы должны запустить его в Async-задаче, как это было с вашим решением.

public static final String TIME_SERVER = "time-a.nist.gov"; 

public static void printTimes() throws IOException { 
      NTPUDPClient timeClient = new NTPUDPClient(); 
      InetAddress inetAddress = InetAddress.getByName(TIME_SERVER); 
      TimeInfo timeInfo = timeClient.getTime(inetAddress); 
      //long returnTime = timeInfo.getReturnTime(); //local device time 
      long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime(); //server time 

      Date time = new Date(returnTime); 
      Log.e("getCurrentNetworkTime", "Time from " + TIME_SERVER + ": " + time); 

      Log.e("Local time", "Local time"); 
      Log.e("Local time", "Current time: " + new Date(System.currentTimeMillis())); 
      Log.e("Local time", "Time info: " + new Date(timeInfo.getReturnTime())); 
      Log.e("Local time", "GetOriginateTimeStamp: " + new Date(timeInfo.getMessage().getOriginateTimeStamp().getTime())); 

      Log.e("NTP time", "Time from " + TIME_SERVER + ": " + time); 

      Log.e("Local time", "Time info: " + new Date(timeInfo.getMessage().getReceiveTimeStamp().getTime())); 
      Log.e("Local time", "GetOriginateTimeStamp: " + new Date(timeInfo.getMessage().getTransmitTimeStamp().getTime())); 

     } 

Резюме получать только ваше чистое время:

public static long getNetworkTime() throws IOException { 
     NTPUDPClient timeClient = new NTPUDPClient(); 
     InetAddress inetAddress = InetAddress.getByName(TIME_SERVER); 
     TimeInfo timeInfo = timeClient.getTime(inetAddress); 
     return timeInfo.getMessage().getReceiveTimeStamp().getTime(); 
    } 

Я надеюсь, что это помогает !!

+0

Что изменилось в этом коде? он похож на мой – Andrain

+0

Пожалуйста, скажите мне, что этот код будет работать как для 2G, так и для 3G? – Andrain

+0

Есть не важные изменения, но иногда обработка плохого исключения или подобные вещи могут заставить вас сходить с ума. Я привел вам пример, который работает для меня на всякий случай, если вы хотите только скопировать и вставить, чтобы доказать. Боюсь, я не проверял, работает ли он с 2G и 3G, но проверьте его. Для того, чтобы он работал, я рекомендую вам проверить это с помощью Wi-Fi или 4G, потому что я могу заверить, что он работает с ними. –

Смежные вопросы