2012-01-03 16 views
25

Tengo la tableta Galaxy GT-P1000 de 7 pulgadas con firmware versión 2.3.3 y teléfonos con Android 2.2. En ambas versiones, cuando intento obtener el tiempo del GPS, aparece con 1 día de antelación desde el 1 de enero de 2012. El mismo código funciona bien en los teléfonos Samsung, LG y Motorola.Android: dispositivos Samsung Galaxy Tabs y Android 2.2 que muestran la fecha del GPS 1 día de antelación desde el 1 de enero de 2012

el código de ejemplo para la aplicación es,

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; 
     } 
    } 


} 

He buscado en Google y luego remitir el documento oficial NMEA que encontrar la manera de utilizar los datos NMEA. Aquí está el Código de Trabajo para el oyente 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); 
} 
+0

He resuelto el problema anteriormente, el uso de NMEA ubicación oyente en Android . Le dará el tiempo correcto de GPS. –

+0

En los tres dispositivos que probé el oyente de ubicación NMEA, la fecha dada por el oyente siempre fue la fecha de mañana. – MiG62

+0

Puede usar el siguiente código para NMEA Listener –

Respuesta

1

Esto parece estar afectando a todos los firmwares de Samsung, estoy tala una preocupación con Samsung sobre esto. Parece estar aislado de los dispositivos de Samsung. Entonces, si puede probar en otro dispositivo o instalar firmware personalizado. ambos han trabajado para mí. y su código se ve bien, no hay nada mal allí, este es un problema de firmware

EDITAR: Me he puesto en contacto con los ingenieros coreanos - han dicho que no estaban al tanto del problema, pero lo han corregido y debería arreglarse en el último actualización para el SGS y otros productos afectados. (a menos que ese dispositivo no haya tenido una actualización por un tiempo, entonces no estoy seguro del SGT) Han dicho que el problema radica en los dispositivos que usan chips Broadcomm ... así que sí

Use el código anterior. parece que funciona para mí a tener que comprobarlo en algunos otros dispositivos, pero sí

+0

Administro 92 dispositivos de varios modelos de Samsung y HTC. Entre estos dispositivos, el problema está restringido a aquellos con un procesador Hummingbird. Observo que algunas versiones del Samsung Galaxy Tab usan un procesador Hummingbird. No estoy seguro si el tuyo está entre ellos. – MiG62

+0

Eso es muy interesante. Me pregunto por qué el firmware está haciendo esto solo en dispositivos con ese procesador. El firmware personalizado soluciona este problema, pero Samsung necesita solucionarlo. – SeanSWatkins

1

Sospecho que Samsung se espera que se trataba de un problema de año bisiesto que sólo va a desaparecer después del 1 de marzo de 2012.

Perdón por decepcionar, ¡pero no fue así! Hemos estado viendo este problema con la aplicación PhoneTrack instalada en teléfonos Samsung desde el 1 de enero y todavía está allí hoy.

Afortunadamente, Samsung ahora actuará responsablemente y emitirá actualizaciones para todos los dispositivos afectados por este error del controlador de GPS.

1

Apagué este error en mi Nexus S con Android 4.0.3 (causando molestamente una gran cantidad de datos incorrectamente marcados).

Ayer me actualizaron a 4.0.4 y esto parece haber solucionado el problema. No estoy seguro si hay un plan para emitir correcciones a versiones anteriores de Android.

Un aullador real de un error, aunque ...

+0

¿podría echar un vistazo a mi comentario (bajo pregunta)? Me pregunto si este enfoque podría funcionar también (en lugar de esta cosa NMEA). – alex

+0

tks para compartir, verificándolo. Qué error tan molesto – sivi

0

Funcionó para mí y lo reemplazó IsValid(String strNMEA) método con esta función:

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); 

    } 
Cuestiones relacionadas