Android:三星Galaxy Tabs和Android 2.2设备显示GPSdate从2012年1月1日前进1天

我有银河选项卡GT-P1000 7英寸固件版本2.3.3和电话运行Android 2.2。 在这两个版本,当我试图从GPS获得时间,从2012年1月1日显示提前1天。同样的代码工作正常在三星,LG和摩托罗拉手机。

该应用程序的示例代码是,

package com.vxceed.dateTime; import java.util.Calendar; import android.app.Activity; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class SampleDateTimeActivity extends Activity { private LocationManager locationManager; private TextView tv; String varTime=""; /** * Location Listener */ LocationListener locationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); } @Override public void onProviderDisabled(String provider) { Toast.makeText(SampleDateTimeActivity.this,"GPS off", Toast.LENGTH_SHORT).show(); } @Override public void onLocationChanged(Location location) { setCurrentLocation(location); } }; private void setCurrentLocation(Location location) { varTime=String.valueOf(location.getTime()); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); locationManager=(LocationManager) this.getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, locationListener); tv=(TextView)findViewById(R.id.textView1); } public void refreshTime(View v) { String currentGPSTime=""; currentGPSTime=varTime; if(currentGPSTime.compareTo("")==0) { tv.setText("Time Not Available"); } else { Calendar cal=Calendar.getInstance(); cal.setTimeInMillis(new Long(currentGPSTime)); long currentDeviceTime=Calendar.getInstance().getTimeInMillis(); Calendar cal2=Calendar.getInstance(); cal2.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)-1,cal.get(Calendar.HOUR_OF_DAY),cal.get(Calendar.MINUTE)); long currentGPSTime_less_one_Day=cal2.getTimeInMillis(); tv.setText( "GPSTIME:"+cal.getTime().toString() +" \n GPS_TIME_in_Millis:"+varTime+"\nDevice_Time_in_millis:"+String.valueOf(currentDeviceTime) +"\nGPS Time -1 day:"+String.valueOf(currentGPSTime_less_one_Day)); } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if (locationManager != null && locationListener != null){ locationManager.removeUpdates(locationListener); locationManager = null; } } } 

我search了Google,然后查阅了NMEA官方文档,找出了如何使用NMEA数据。 以下是NMEA听众的工作准则:

 NmeaListener nmeaListener = new NmeaListener() { @Override public void onNmeaReceived(long timestamp, String nmea) { parse(nmea); } }; private boolean parse(String strNMEA) { // Discard the sentence if its checksum does not match our calculated // checksum boolean bStatus = false; try { if (!IsValid(strNMEA)) { return false; } String[] sArrNMEA = strNMEA.split(","); String strNMEAType = sArrNMEA[0]; if (strNMEAType.equals("$GPRMC")) { bStatus = ParseGPRMC(sArrNMEA); } else { bStatus = false; } sArrNMEA = null; } catch (Exception e) { } return bStatus; } private boolean ParseGPRMC(String[] sArrNMEA) { boolean result = false; try { if (sArrNMEA.length > 9) { int Hr = 0; int Mins = 0; int Secs = 0; if (!sArrNMEA[1].equals("")) { Hr = Integer.parseInt(sArrNMEA[1].substring(0, 2)); Mins = Integer.parseInt(sArrNMEA[1].substring(2, 4)); if (sArrNMEA[1].length() > 6) { Secs = Integer.parseInt(sArrNMEA[1].substring(4, 6)); } else { Secs = Integer.parseInt(sArrNMEA[1].substring(4)); } } if (!sArrNMEA[9].equals("")) { int Day = Integer.parseInt(sArrNMEA[9].substring(0, 2)); int Month = Integer.parseInt(sArrNMEA[9].substring(2, 4)); if (Month > 0) { Month = Month - 1; } int Year = Integer.parseInt(sArrNMEA[9].substring(4)); Year = 2000 + Year; if (!sArrNMEA[1].equals("")) { Calendar cal = Calendar.getInstance(TimeZone .getTimeZone("UTC")); cal.set(Year, Month, Day, Hr, Mins, Secs); nmeaTime = String.valueOf(cal.getTimeInMillis()); } } result = true; } } catch (Exception e) { } return result; } private boolean IsValid(String strNMEA) { // Compare the characters after the asterisk to the calculation strNMEA = strNMEA.replace("\r", ""); strNMEA = strNMEA.replace("\n", ""); return strNMEA.substring(0, strNMEA.length()) .substring(strNMEA.indexOf("*") + 1) .equalsIgnoreCase(GetChecksum(strNMEA)); } private String GetChecksum(String strNMEA) { // Loop through all chars to get a checksum int Checksum = 0; try { char ch = '\0'; for (int i = 0; i < strNMEA.length(); i++) { ch = strNMEA.charAt(i); if (ch == '$') { // Ignore the dollar sign } else if (ch == '*') { // Stop processing before the asterisk break; } else { // Is this the first value for the checksum? if (Checksum == 0) { // Yes. Set the checksum to the value Checksum = (byte) ch; } else { // No. XOR the checksum with this character's value Checksum = Checksum ^ (byte) ch; } } } } catch (Exception e) { } // Return the checksum formatted as a two-character hexadecimal return Integer.toHexString(Checksum); } 

    Related of "Android:三星Galaxy Tabs和Android 2.2设备显示GPSdate从2012年1月1日前进1天"

    这似乎正在影响所有的三星固件固件,我正在与三星关注这个问题。 这似乎是孤立的三星设备。 所以如果你可以在其他设备上testing,或者安装自定义固件。 这两个人都为我工作。 你的代码看起来不错,没有错,这是一个固件问题

    编辑:我已经联系了韩国工程师 – 他们说他们没有意识到这个问题,但已经修补,应该在最新的SGS和其他受影响的产品更新。 (当然,除非该设备还没有更新一段时间 – 所以不清楚SGT)他们说问题在于使用Broadcom芯片的设备…所以是的

    使用上面的代码。 它似乎为我工作将不得不检查一些其他设备,但耶

    我怀疑三星希望这是一个闰年的问题,将在2012年3月1日之后消失。

    对不起,令人失望 – 但它没有! 从1月1日起,我们已经在三星手机上安装了应用程序PhoneTrack,并且今天仍然存在这个问题。

    希望三星现在可以负责任地采取行动,并为受此GPS驱动程序错误影响的所有设备发布更新。

    我在运行Android 4.0.3的Nexus S上遇到了这个bug(令人讨厌的是导致大量数据被错误地加上时间戳)。

    我昨天升级到4.0.4,这似乎已经解决了这个问题。 不知道是否有计划发布修复以前的Android版本。

    一个真正的嚎叫虽然…

    它为我工作,我用这个函数replace了IsValid(String strNMEA)方法:

     private boolean checksum(String strNMEA) { int checksum = 0; strNMEA = strNMEA.replace("\r", ""); strNMEA = strNMEA.replace("\n", ""); String strChecksum = strNMEA.substring(strNMEA.indexOf("*") + 1); String str = strNMEA.substring(1, strNMEA.indexOf("*")); for (int i = 0; i < str.length(); i++) { checksum = checksum ^ str.charAt(i); } return checksum == Integer.valueOf(strChecksum, 16); }