2012-01-03 7 views
25

मेरे पास गैलेक्सी टैब जीटी-पी 1000 7 इंच फर्मवेयर संस्करण 2.3.3 और एंड्रॉइड 2.2 चलाने वाले फ़ोन हैं। दोनों संस्करणों में जब भी मैं जीपीएस से समय प्राप्त करने की कोशिश कर रहा हूं, यह 1 जनवरी 2012 से 1 दिन का आगाह दिखा रहा है। सैमसंग, एलजी और मोटोरोला फोन पर एक ही कोड ठीक काम कर रहा है।एंड्रॉइड: सैमसंग गैलेक्सी टैब और एंड्रॉइड 2.2 डिवाइस जीपीएस दिनांक दिखा रहा है 1 जनवरी 2012 से 1 दिन का अग्रिम

अनुप्रयोग के लिए नमूना कोड है,

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


} 

मैं गूगल खोज की है और उसके बाद मैं यह पता लगाने कैसे 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); 
} 
+0

मैं Android में ऊपर मुद्दा, उपयोग NMEA स्थान श्रोता समाधान कर लिया है । यह सही जीपीएस समय देगा। –

+0

एनएमईए स्थान श्रोता का परीक्षण करने वाले तीन उपकरणों पर, श्रोता द्वारा दी गई तारीख हमेशा कल की तारीख थी। – MiG62

+0

आप एनएमईए श्रोता –

उत्तर

1

यह, मैं इस बारे में सैमसंग के साथ एक चिंता का विषय प्रवेश करने कर रहा हूँ सभी शेयर सैमसंग firmwares को प्रभावित करने जा रहा है। ऐसा लगता है कि सैमसंग उपकरणों के लिए अलग किया गया है। तो यदि आप किसी अन्य डिवाइस पर परीक्षण कर सकते हैं, या कस्टम फर्मवेयर स्थापित कर सकते हैं। दोनों ने मेरे लिए काम किया है। और आपका कोड अच्छा दिखता है, वहां कुछ भी गलत नहीं है, यह एक फर्मवेयर मुद्दा है

संपादित करें: मैंने कोरियाई इंजीनियरों से संपर्क किया है - उन्होंने कहा है कि वे समस्या से अवगत नहीं थे लेकिन उन्होंने पैच किया है और इसे नवीनतम में ठीक किया जाना चाहिए एसजीएस और अन्य प्रभावित उत्पादों के लिए अद्यतन करें। (जब तक कि डिवाइस के पास थोड़ी देर के लिए अपडेट नहीं था - तो एसजीटी के बारे में निश्चित नहीं है) उन्होंने कहा है कि समस्या ब्रॉडकॉम चिप्स का उपयोग कर उपकरणों के साथ है ... इसलिए हाँ

उपरोक्त कोड का उपयोग करें। यह काम करने लगता है मुझे कुछ अन्य उपकरणों पर यह जांच करने के लिए है, लेकिन हाँ के लिए

+0

मैं सैमसंग और एचटीसी के विभिन्न मॉडलों के 92 डिवाइस का प्रबंधन करता हूं। इन उपकरणों में से, समस्या एक हमिंगबर्ड प्रोसेसर वाले लोगों तक ही सीमित है। मुझे लगता है कि सैमसंग गैलेक्सी टैब के कुछ संस्करण एक हमिंगबर्ड प्रोसेसर का उपयोग करते हैं। सुनिश्चित नहीं है कि आपका बीच उनमें से है या नहीं। – MiG62

+0

यह बहुत दिलचस्प है। मुझे आश्चर्य है कि फर्मवेयर इस प्रोसेसर के साथ केवल डिवाइस पर क्यों कर रहा है। कस्टम फर्मवेयर इस समस्या को ठीक करता है, लेकिन सैमसंग को एक फिक्स डालना होगा। – SeanSWatkins

1

मुझे लगता है सैमसंग उम्मीद कर रहे थे कि कि यह एक लीप वर्ष मुद्दा जो सिर्फ बाद 1st मार्च दूर जाना होता है, था 2012

निराश करने के लिए खेद है - लेकिन यह नहीं है! हम इस समस्या को 1 जनवरी से सैमसंग फोन पर स्थापित ऐप फोनट्रैक के साथ देख रहे हैं और आज भी वहां है।

उम्मीद है कि सैमसंग अब जिम्मेदारी से कार्य करेगा और इस जीपीएस ड्राइवर बग से प्रभावित सभी उपकरणों के लिए अपडेट जारी करेगा।

1

मैंने अपने नेक्सस एस एंड्रॉइड 4.0.3 पर चल रहे इस बग को मारा (कष्टप्रद रूप से डेटा का पूरा समूह गलत तरीके से टाइमस्टैम्प किया जा रहा है)।

मुझे कल 4.0.4 में अपग्रेड किया गया था और ऐसा लगता है कि इस मुद्दे को ठीक किया गया है। सुनिश्चित नहीं है कि पिछले एंड्रॉइड संस्करणों को फिक्स जारी करने की कोई योजना है या नहीं।

एक बग हालांकि की एक वास्तविक बहुत बड़ी गलती ...

+0

क्या आप मेरी टिप्पणी (प्रश्न के तहत) पर एक नज़र डालेंगे? मैं सोच रहा हूं कि यह दृष्टिकोण भी काम कर सकता है (इस एनएमईए चीज के बजाय)। साझा करने के लिए – alex

+0

tks, इसे जांचना। क्या एक कष्टप्रद बग है – sivi

0

यह मेरे लिए काम किया है और मैं इस समारोह के साथ 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); 

    } 
संबंधित मुद्दे