2013-02-13 47 views
1

我正在設計一個服務類來定期將數據更新到服務器中。一切工作正常,但我必須將當前UTC日期時間以「MM/dd/yyyy HH:mm:ss」這種格式發送到服務器。我嘗試了很多方法來達到這個目標,但他們沒有給我想要的結果。類的試圖讓UTC日期時間強制關閉應用程序

的源代碼:

public class MyAlarmService extends Service { 

     String device_id; 
    // GPSTracker class 
     GPSTracker gps; 

     String date_time; 
@Override 
public void onCreate() { 
// TODO Auto-generated method stub 
    //Toast.makeText(this, "Service created", Toast.LENGTH_LONG).show(); 

    //---get a Record--- 

    } 

@Override 
public IBinder onBind(Intent intent) { 
// TODO Auto-generated method stub 
//Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG).show(); 
return null; 
} 

@Override 
public void onDestroy() { 
// TODO Auto-generated method stub 
super.onDestroy(); 
//Toast.makeText(this, "Service Destroyed.", Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
// TODO Auto-generated method stub 
super.onStart(intent, startId); 

//Toast.makeText(this, "Service Started.", Toast.LENGTH_LONG).show(); 


//create class object 

gps = new GPSTracker(this); 

    // check if GPS enabled   
    if(gps.canGetLocation()) 
    { 
     double latitude = gps.getLatitude(); 
     double longitude = gps.getLongitude(); 
     String locationUsing = gps.getLocationUsing(); 

     final TelephonyManager tm =(TelephonyManager)getBaseContext().getSystemService(Context.TELEPHONY_SERVICE); 

     String deviceid = tm.getDeviceId(); 


//  Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
//  aGMTCalendar.getTimeInMillis(); //or getTimeInMillis() 





     **Date d = new Date(year); 
     CharSequence s = DateFormat.format("yyyy-MM-dd hh:mm:ss", d.getTime());** 

     // get_date(); 






     **SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd"); 
     dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT")); 
     java.util.Date date = null; 
     System.out.println(dateFormatGmt.format(date)); 

     Toast.makeText(getApplicationContext(),""+date, Toast.LENGTH_LONG).show();** 


     //Toast.makeText(getApplicationContext(),"Device ID: "+deviceid+ " Time: "+ s+"\nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show(); 

     Log.w("\nLat: " , ""+latitude); 
     Log.w("\nLong: " , ""+longitude); 

     if(haveNetworkConnection()) 
     { 


     // sendPostRequest(deviceid,date_time,""+latitude,""+longitude); 








//   ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3); 
//   
//   nameValuePairs.add(new BasicNameValuePair("lat",""+latitude)); 
//   nameValuePairs.add(new BasicNameValuePair("lng",""+longitude)); 
//   
//   
//   try 
//   { 
//    HttpClient httpclient = new DefaultHttpClient(); 
//    //HttpPost httppost = new HttpPost("http://eatcastle.com/security_system_portal/api/getting_lat_lng.php"); 
//    HttpPost httppost = new HttpPost("http://google.com"); 
//    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
//    HttpResponse response = httpclient.execute(httppost); 
//    String responseBody = EntityUtils.toString(response.getEntity()); 
//    
//    //Toast.makeText(getApplicationContext(),""+responseBody,Toast.LENGTH_LONG).show(); 
//   } 
//   catch (Throwable t) 
//   { 
//    Log.d("Error",""+t); 
//   } 

     } 
     else 
     { 
      Toast.makeText(getApplicationContext(),"No Internet connection or Wifi available",Toast.LENGTH_LONG).show(); 
     } 
    } 
    else 
    { 
     // GPS or Network is not enabled 
     Toast.makeText(getApplicationContext(), "No Network no GPS", Toast.LENGTH_LONG).show(); 
    } 
} 

@Override 
public boolean onUnbind(Intent intent) { 
// TODO Auto-generated method stub 
// Toast.makeText(this, "Service binded", Toast.LENGTH_LONG).show(); 
return super.onUnbind(intent); 
} 

//======================================================================================================= 
//check packet data and wifi 
//======================================================================================================= 
private boolean haveNetworkConnection() 
{ 
    boolean haveConnectedWifi = false; 
    boolean haveConnectedMobile = false; 

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
    for (NetworkInfo ni : netInfo) 
    { 
     if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
      if (ni.isConnected()) 
       haveConnectedWifi = true; 
     if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
      if (ni.isConnected()) 
       haveConnectedMobile = true; 
    } 
    return haveConnectedWifi || haveConnectedMobile; 
} 
//======================================================================================================= 
    //checking packet data and wifi END 
    //======================================================================================================= 


void get_date() 
{ 



} 







//sending async post request 
private void sendPostRequest(String deviceid, String date_time,String latitude, String longitude) { 

    class SendPostReqAsyncTask extends AsyncTask<String, Void, String>{ 

     @Override 
     protected String doInBackground(String... params) { 

      String paramDeviceid = params[0]; 
      String paramDate_time = params[1]; 
      String paramLatitude = params[2]; 
      String paramLongitude = params[3]; 

      //System.out.println("*** doInBackground ** paramUsername " + paramUsername + " paramPassword :" + paramPassword); 

      HttpClient httpClient = new DefaultHttpClient(); 

      // In a POST request, we don't pass the values in the URL. 
      //Therefore we use only the web page URL as the parameter of the HttpPost argument 
      HttpPost httpPost = new HttpPost("http://google.com"); 

      // Because we are not passing values over the URL, we should have a mechanism to pass the values that can be 
      //uniquely separate by the other end. 
      //To achieve that we use BasicNameValuePair    
      //Things we need to pass with the POST request 
      BasicNameValuePair DeviceidBasicNameValuePair = new BasicNameValuePair("stringLoginUser", paramDeviceid); 
      BasicNameValuePair Date_timeBasicNameValuePAir = new BasicNameValuePair("stringLoginPwd", paramDate_time); 
      BasicNameValuePair LatitudeBasicNameValuePAir = new BasicNameValuePair("stringLoginPwd", paramLatitude); 
      BasicNameValuePair LongitudeBasicNameValuePAir = new BasicNameValuePair("stringLoginPwd", paramLongitude); 

      // We add the content that we want to pass with the POST request to as name-value pairs 
      //Now we put those sending details to an ArrayList with type safe of NameValuePair 
      List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>(); 
      nameValuePairList.add(DeviceidBasicNameValuePair); 
      nameValuePairList.add(Date_timeBasicNameValuePAir); 
      nameValuePairList.add(LatitudeBasicNameValuePAir); 
      nameValuePairList.add(LongitudeBasicNameValuePAir); 

      try { 
       // UrlEncodedFormEntity is an entity composed of a list of url-encoded pairs. 
       //This is typically useful while sending an HTTP POST request. 
       UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairList); 

       // setEntity() hands the entity (here it is urlEncodedFormEntity) to the request. 
       httpPost.setEntity(urlEncodedFormEntity); 

       try { 
        // HttpResponse is an interface just like HttpPost. 
        //Therefore we can't initialize them 
        HttpResponse httpResponse = httpClient.execute(httpPost); 



        // According to the JAVA API, InputStream constructor do nothing. 
        //So we can't initialize InputStream although it is not an interface 
        InputStream inputStream = httpResponse.getEntity().getContent(); 

        InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 

        BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 

        StringBuilder stringBuilder = new StringBuilder(); 

        String bufferedStrChunk = null; 

        while((bufferedStrChunk = bufferedReader.readLine()) != null){ 
         stringBuilder.append(bufferedStrChunk); 
        } 

        return stringBuilder.toString(); 

       } catch (ClientProtocolException cpe) { 
        System.out.println("First Exception caz of HttpResponese :" + cpe); 
        cpe.printStackTrace(); 
       } catch (IOException ioe) { 
        System.out.println("Second Exception caz of HttpResponse :" + ioe); 
        ioe.printStackTrace(); 
       } 

      } catch (UnsupportedEncodingException uee) { 
       System.out.println("An Exception given because of UrlEncodedFormEntity argument :" + uee); 
       uee.printStackTrace(); 
      } 

      return null; 
     } 

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

      Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 






     }   
    } 

    SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask(); 
    sendPostReqAsyncTask.execute(deviceid, date_time,latitude,longitude);  
} 




} 

我應該如何去接當前UTC日期時間在上面提到的格式,並將其發送到服務器?

P.S .:有時在實現不同的方法時,我還發現一個IDE錯誤,說未定義新的Date()構造函數。

回答

1

你爲什麼要分配null到你的日期值..?

檢查了這一點:

Date formattedDate = new Date(System.currentTimeMillis()); 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy MM dd, hh:mm a", Locale.US); 

String time = sdf.format(formattedDate); 
3

您可以使用System.currentTimeMillis(),這將返回長數毫秒的從1970年〇時00分00秒UTC 1月1日開始。您可以使用DateFormats在任何時區將日期轉換爲字符串:

DateFormat df = DateFormat.getTimeInstance(); 
df.setTimeZone(TimeZone.getTimeZone("gmt")); 
String gmtTime = df.format(new Date());