मैं जीपीएस रिसीवर की वर्तमान स्थिति की जांच कैसे कर सकता हूं?


90

मैं जीपीएस रिसीवर की वर्तमान स्थिति की जांच कैसे कर सकता हूं? मैंने पहले से ही LocationListener onStatusChangedविधि की जांच की लेकिन किसी तरह यह लगता है कि काम नहीं कर रहा है, या सिर्फ गलत संभावना है।

मूल रूप से मुझे बस यह जानना होगा कि स्क्रीन के शीर्ष पर स्थित GPS आइकन ब्लिंक कर रहा है (कोई वास्तविक फिक्स नहीं) या सॉलिड (फिक्स उपलब्ध है)।

जवाबों:


150

स्पीडव्यू के डेवलपर के रूप में: एंड्रॉइड के लिए जीपीएस स्पीडोमीटर, मैंने इस समस्या के हर संभव समाधान की कोशिश की होगी, सभी एक ही नकारात्मक परिणाम के साथ। चलो दोहराते हैं कि क्या काम नहीं करता है:

  1. onStatusChanged () Eclair और Froyo पर नहीं बुलाया जा रहा है।
  2. बस सभी उपलब्ध उपग्रहों की गिनती करना, ज़ाहिर है, बेकार है।
  3. यह जाँचना कि क्या उपग्रहों में से कोई भी उपग्रहों के लिए सही है (InFix) () बहुत उपयोगी नहीं है। सिस्टम स्पष्ट रूप से फिक्स खो देता है, लेकिन रिपोर्ट करता है कि अभी भी कई सिट हैं जो इसमें उपयोग किए जाते हैं।

इसलिए यहां केवल एक ही समाधान है जो मैंने पाया है, और एक जो मैं वास्तव में अपने ऐप में उपयोग करता हूं। मान लें कि हमारे पास यह सरल वर्ग है जो GpsStatus को लागू करता है।

private class MyGPSListener implements GpsStatus.Listener {
    public void onGpsStatusChanged(int event) {
        switch (event) {
            case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                if (mLastLocation != null)
                    isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;

                if (isGPSFix) { // A fix has been acquired.
                    // Do something.
                } else { // The fix has been lost.
                    // Do something.
                }

                break;
            case GpsStatus.GPS_EVENT_FIRST_FIX:
                // Do something.
                isGPSFix = true;

                break;
        }
    }
}

ठीक है, अब onLocationChanged () में हम निम्नलिखित जोड़ते हैं:

@Override
public void onLocationChanged(Location location) {
    if (location == null) return;

    mLastLocationMillis = SystemClock.elapsedRealtime();

    // Do something.

    mLastLocation = location;
}

और बस। मूल रूप से, यह वह रेखा है जो यह सब करती है:

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;

आप बेशक मिल के मूल्य को कम कर सकते हैं, लेकिन मैं इसे लगभग 3-5 सेकंड सेट करने का सुझाव दूंगा।

यह वास्तव में काम करता है और यद्यपि मैंने उस स्रोत कोड को नहीं देखा है जो मूल जीपीएस आइकन को खींचता है, यह इसके व्यवहार को दोहराने के करीब आता है। आशा है कि यह किसी की मदद करता है।


नमस्ते, मैं सोच रहा हूं कि उपलब्ध उपग्रहों की गिनती इस उदाहरण की तरह बेकार क्यों है? यदि उपग्रहों की संख्या 0 पाई जाती है तो इसका कोई संबंध नहीं है, या क्या मैं गलत हूं? groups.google.com/group/android-developers/browse_thread/thread/...
per_jansson

3
हाय स्टीफन, क्या आप समझा सकते हैं कि क्यों GGFix काम करता है। धन्यवाद, निक
निकोक्स

वैसे, मैंने देखा है कि आईसीएस में उन्होंने समय बढ़ा दिया जब तक कि सिस्टम ने रिपोर्ट करना शुरू नहीं किया कि जीपीएस फिक्स खो गया है। कम से कम 4.0.3 में यह ठीक 10 सेकंड है।
साउंडमावेन

महान काम करता है, और ICS के लिए 3-5 के विपरीत 10 सेकंड का उपयोग करना भी काफी अच्छी तरह से काम करता है। सौभाग्य से फिक्सिंग मेरे ऐप की एक आवश्यक विशेषता नहीं है, लेकिन इसे जानने में सक्षम होना अच्छा है। धन्यवाद।
टॉम

1
लेकिन mLastLocationMillisजीपीएस के अलावा किसी अन्य स्रोत द्वारा सेट किए जाने पर क्या यह टूटता नहीं है ? प्रणाली होगा दावा है कि तुलना में isGPSFixसच है लेकिन वास्तविकता में यह सिर्फ है किसी भी फिक्स (शायद फोन नेटवर्क से एक)
avalancha

25

जीपीएस आइकन प्राप्त प्रसारण इरादों के अनुसार अपनी स्थिति को बदलने लगता है। आप निम्न कोड नमूने के साथ अपने राज्य को स्वयं बदल सकते हैं:

सूचित करें कि GPS सक्षम किया गया है:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);

सूचित करें कि GPS को सुधार प्राप्त हो रहे हैं:

Intent intent = new Intent("android.location.GPS_FIX_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);

यह सूचित करें कि GPS अब फिक्स प्राप्त नहीं कर रहा है:

Intent intent = new Intent("android.location.GPS_FIX_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);

सूचित करें कि GPS अक्षम कर दिया गया है:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);

उदाहरण के लिए रिसीवर रजिस्टर करने के लिए उदाहरण कोड:

// MyReceiver must extend BroadcastReceiver
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter("android.location.GPS_ENABLED_CHANGE");
filter.addAction("android.location.GPS_FIX_CHANGE");
registerReceiver(receiver, filter);

इन प्रसारण इरादों को प्राप्त करके आप जीपीएस स्थिति में परिवर्तन को नोटिस कर सकते हैं। हालाँकि, आपको तभी सूचित किया जाएगा जब राज्य बदल जाएगा। इस प्रकार इन अंतरों का उपयोग करके वर्तमान स्थिति को निर्धारित करना संभव नहीं है।


मुझे नहीं पता कि आप उस प्रसारण को आप आवेदन से कैसे भेज सकते हैं क्योंकि ऐसा लगता है कि यह एक सिस्टम संरक्षित प्रसारण है, जिसका अर्थ केवल सिस्टम ही भेज सकता है। कोई भी ऐप जो इरादे भेज रहा है दुर्घटनाग्रस्त हो जाना चाहिए।
जोक्सट्रैक्स

छह साल पहले इसे भेजना संभव था, जब मैंने जवाब लिखा। स्पष्ट रूप से उन्होंने तब से कुछ सुरक्षा प्रणाली को जोड़ा है।
6

मैं इन इरादों का उपयोग यह बताने के लिए कर रहा था कि अन्य ऐप कब जीपीएस का उपयोग कर रहे हैं। मेरा मानना ​​है कि नूगट के साथ शुरू, आप अब इन इरादों के लिए भी नहीं सुन सकते हैं, या वे बदल गए हैं! मैं अपने ऐप के साथ स्थान के लिए नहीं सुनना चाहता। किसी के पास कोई अन्य विचार है?
फ्लाईव्यू

हाँ, मुझे वह दुर्घटना मिल गई है: 05-14 10: 25: 24.113 17344-17344 / xxx.yyy.zzz.debug E / AndroidRuntime: वसा अपवाद: मुख्य प्रक्रिया: xxx.yyy.zzz.debug, PID: 17344 java। lang.SecurityException: अनुमति अस्वीकृत: प्रसारण को भेजने की अनुमति नहीं है। android.location.GPS_FIX_CHANGE को pid ​​= 17344, uid = 10416
unlimited101

19

नए सदस्य इसलिए दुर्भाग्य से टिप्पणी करने या मतदान करने में असमर्थ हैं, हालांकि ऊपर स्टीफन डे का पद ठीक उसी समस्या का सही समाधान था जिसकी मुझे मदद मिल रही है।

निम्न पंक्ति के लिए एक छोटा सा परिवर्तन:

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;

सेवा:

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < (GPS_UPDATE_INTERVAL * 2);

मूल रूप से एक धीमी गति से चलने वाले गेम का निर्माण करने के लिए और मेरा अपडेट अंतराल पहले से ही 5 सेकंड के लिए सेट है, एक बार जीपीएस सिग्नल 10+ सेकंड के लिए बाहर हो जाता है, कुछ को ट्रिगर करने का सही समय।

चीयर्स मेट, लगभग 10 घंटे बिताए इससे पहले कि मैं आपकी पोस्ट पाएं इस समाधान को हल करने की कोशिश कर रहा हूं :)


14

ठीक है, तो चलो अब तक के सभी उत्तरों और अपडेट के संयोजन की कोशिश करते हैं और कुछ इस तरह करते हैं:

  • ACCESS_FINE_LOCATIONअपने प्रकट होने की अनुमति जोड़ें
  • सिस्टम का एक उदाहरण प्राप्त करें LocationManager
  • एक बनाएं GpsStatus.Listenerकि करने के लिए प्रतिक्रिया करता हैGPS_EVENT_SATELLITE_STATUS
  • रजिस्टर के साथ श्रोता LocationManagerके साथaddGpsStatusListener

GPS श्रोता कुछ इस तरह हो सकता है:

GpsStatus.Listener listener = new GpsStatus.Listener() {
    void onGpsStatusChanged(int event) {
        if (event == GPS_EVENT_SATELLITE_STATUS) {
            GpsStatus status = mLocManager.getGpsStatus(null);
            Iterable<GpsSatellite> sats = status.getSatellites();
            // Check number of satellites in list to determine fix state
        }
    }
}

GPS और सैटेलाइट की जानकारी कब और क्या दी जाती है, इस बारे में एपीआई थोड़ा अस्पष्ट हैं, लेकिन मुझे लगता है कि यह देखने के लिए एक विचार होगा कि कितने उपग्रह उपलब्ध हैं। यदि यह तीन से नीचे है, तो आप ठीक नहीं कर सकते। यदि यह अधिक है, तो आपको एक फिक्स होना चाहिए।

परीक्षण और त्रुटि संभवतः यह निर्धारित करने का तरीका है कि एंड्रॉइड कितनी बार उपग्रह की सूचना देता है, और प्रत्येक GpsSatelliteवस्तु में क्या जानकारी होती है।


उपलब्ध उपग्रहों की गिनती के साथ समस्या यह है कि, भले ही आपके पास देखने में 5 उपग्रह हों, लेकिन इसका मतलब यह नहीं है कि एक निर्धारण हमेशा संभव है। (आपने इसे सही लिखकर "यदि यह अधिक है, तो आपको ठीक करना चाहिए "
nr1

वास्तव में। हालाँकि मुझे इस बारे में कोई जानकारी नहीं है कि फ़िक्सेस का गठन करने के लिए किस जानकारी की आवश्यकता है, या यह कैसे / क्या इसे किसी GpsSatelliteऑब्जेक्ट से पुनर्प्राप्त किया जा सकता है ।
क्रिस्टोफर ओर्र

एक और विचार .. आप अपने प्रश्न में इसका उल्लेख नहीं करते हैं, लेकिन क्या आपने LocationManager.requestLocationUpdatesसमय और दूरी सेटिंग्स के साथ 0 पर सेट का उपयोग करने की कोशिश की है ? जैसे ही वे होते हैं आपको जीपीएस फिक्स भेजना चाहिए। यदि आपको कुछ भी प्राप्त नहीं हो रहा है, तो आप सबसे अधिक संभावना नहीं है। यदि आप चाहें तो आप इसे ऊपर के श्रोता के साथ जोड़ सकते हैं।
क्रिस्टोफर ओर

1
Ipsating "sats" और इस्तेमाल किया गया।
डेलरिअमटर्मेंस

8

विंडोज़ मोबाइल पर जीपीएस के साथ काम करने के कुछ वर्षों के बाद, मैंने महसूस किया कि जीपीएस फिक्स को "खोने" की अवधारणा व्यक्तिपरक हो सकती है। बस यह बताने के लिए कि जीपीएस आपको क्या बताता है, एक NMEAListener को जोड़ने और वाक्य को पार्स करने से आपको पता चल जाएगा कि यह फिक्स "वैध" था या नहीं। Http://www.gpsinformation.org/dale/nmea.htm#GGA देखें । दुर्भाग्य से कुछ GPS के साथ यह मान एक "अच्छे फिक्स" क्षेत्र में ऑपरेशन के सामान्य पाठ्यक्रम के दौरान भी आगे और पीछे होगा।

तो, दूसरा उपाय यह है कि फोन के समय (यूटीसी में परिवर्तित) के खिलाफ जीपीएस स्थान के यूटीसी समय की तुलना की जाए। यदि वे एक निश्चित समय के अंतर से अलग हैं, तो आप मान सकते हैं कि आपने जीपीएस की स्थिति खो दी है।


क्या आप विधि की तुलना करने के समय की व्याख्या करना चाहेंगे? स्टीफन डे के जवाब में, उन्होंने अंतिम फ़र्क और नवीनतम GPS_EVENT_SATELLITE_STATUS घटना के बीच के समय के अंतर की तुलना की ... निश्चित नहीं कि यह क्या माप रहा है।
रोकी जीई

7

मेरे एमएससी प्रोजेक्ट पर काम करते समय इसी तरह की समस्या आती है, ऐसा लगता है कि डिवाइस के स्थिर स्थान पर रहने के दौरान डे के उत्तर में गलती से "कोई फिक्स" नहीं था। मैंने समाधान को थोड़ा संशोधित किया है जो स्थिर स्थान में मेरे लिए ठीक काम करता है। मैं यह नहीं बताऊंगा कि यह बैटरी को कैसे प्रभावित करेगा क्योंकि यह मेरी मुख्य चिंता नहीं है, लेकिन यहाँ है कि कैसे मैंने इसे ठीक करने के स्थान को फिर से अनुरोध करके अपडेट किया है।

private class MyGPSListener implements GpsStatus.Listener {
    public void onGpsStatusChanged(int event) {
        switch (event) {
        case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
            if (Global.getInstance().currentGPSLocation != null)
            {
                if((SystemClock.elapsedRealtime() - mLastLocationMillis) < 20000)
                {
                    if (!hasGPSFix) 
                        Log.i("GPS","Fix Acquired");
                    hasGPSFix = true;
                } 
                else
                {
                    if (hasGPSFix) 
                    {
                        Log.i("GPS","Fix Lost (expired)");
                        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
                    }
                    hasGPSFix = false;
                }
            }
            break;
        case GpsStatus.GPS_EVENT_FIRST_FIX:
            Log.i("GPS", "First Fix/ Refix");
            hasGPSFix = true;
            break;
        case GpsStatus.GPS_EVENT_STARTED:
            Log.i("GPS", "Started!");
            break;
        case GpsStatus.GPS_EVENT_STOPPED:
            Log.i("GPS", "Stopped");
            break;
        }
    }
}

5

ठीक है, हर काम करने के दृष्टिकोण को एक साथ रखने के परिणामस्वरूप यह होगा (पदावनत से निपटने के लिए GpsStatus.Listener):

private GnssStatus.Callback mGnssStatusCallback;
@Deprecated private GpsStatus.Listener mStatusListener;
private LocationManager mLocationManager;

@Override
public void onCreate() {
    mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    if (checkPermission()) {
       mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_UPDATE_INTERVAL, MIN_DISTANCE, this);
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        mGnssStatusCallback = new GnssStatus.Callback() {
            @Override
            public void onSatelliteStatusChanged(GnssStatus status) {
                satelliteStatusChanged();
            }

            @Override
            public void onFirstFix(int ttffMillis) {
                gpsFixAcquired();

            }
        };
        mLocationManager.registerGnssStatusCallback(mGnssStatusCallback);
    } else {
        mStatusListener = new GpsStatus.Listener() {
            @Override
            public void onGpsStatusChanged(int event) {
                switch (event) {
                    case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                        satelliteStatusChanged();
                        break;
                    case GpsStatus.GPS_EVENT_FIRST_FIX:
                        // Do something.
                        gpsFixAcquired();
                        break;
                }
            }
        };
        mLocationManager.addGpsStatusListener(mStatusListener);
    }
}

private void gpsFixAcquired() {
    // Do something.
    isGPSFix = true;
}

private void satelliteStatusChanged() {
    if (mLastLocation != null)
        isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < (GPS_UPDATE_INTERVAL * 2);

    if (isGPSFix) { // A fix has been acquired.
        // Do something.
    } else { // The fix has been lost.
        // Do something.
    }
}

@Override
public void onLocationChanged(Location location) {
    if (location == null) return;

    mLastLocationMillis = SystemClock.elapsedRealtime();

    mLastLocation = location;
}

@Override
public void onStatusChanged(String s, int i, Bundle bundle) {

}

@Override
public void onProviderEnabled(String s) {

}

@Override
public void onProviderDisabled(String s) {

}

नोट: यह उत्तर उपरोक्त उत्तरों का संयोजन है।


1
जब तक आप अन्य लेखक (ओं) को श्रेय देते हैं, नए या व्युत्पन्न कार्य के लिए अपने स्वयं के उत्थान प्राप्त करने में कोई समस्या नहीं है। यहाँ नियम अन्य लोगों के जवाबों की चोरी करने वाले लोगों के बारे में अधिक चिंतित हैं और उन्हें बेईमानी से आकर्षित करने के लिए स्टैक ओवरफ्लो पर अन्यत्र उपयोग कर रहे हैं। चूंकि आपने उल्लेख किया है कि आपने अन्य उत्तरों पर निर्माण किया है, मुझे लगता है कि यह ठीक है।
रोकें

3

यदि आपको बस यह जानना है कि क्या कोई फिक्स है, तो जीपीएस रिसीवर द्वारा प्रदान किए गए अंतिम ज्ञात स्थान की जांच करें और यह जानने के लिए .getTime () मान जांचें कि यह कितना पुराना है। यदि यह हाल ही में पर्याप्त है (जैसे ... कुछ सेकंड) तो आपके पास एक फिक्स है।

   LocationManager lm = (LocationManager)context.getSystemService(LOCATION_SERVICE); 
   Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

   // Get the time of the last fix
   long lastFixTimeMillis = loc.getTime(); 

... और अंत में तुलना करें कि वर्तमान दिनांक समय (UTC में!)। यदि यह हाल ही में आपके पास ठीक है।

मैं अपने ऐप में ऐसा करता हूं और अब तक बहुत अच्छा हूं।


+1 लगता है कि क्या आप तुरंत जानना चाहते हैं कि क्या कोई फिक्स है।
AgentKnopf

2

GPS स्थिति बदलने पर आप अपडेट होने के लिए LocationManager.addGpsStatusListener का उपयोग करने का प्रयास कर सकते हैं। ऐसा लगता है कि GPS_EVENT_STARTED और GPS_EVENT_STOPPED वह हो सकता है जो आप खोज रहे हैं।


3
एक स्थिति श्रोता GPS_EVENT_FIRST_FIXएक फिट फिट की तरह लगता है।
क्रिस्टोफर ओर्र

2

मैं गलत हो सकता हूं, लेकिन ऐसा लगता है कि लोगों को इस विषय से दूर जाना पड़ रहा है

मुझे बस यह जानना चाहिए कि स्क्रीन के शीर्ष पर जीपीएस आइकन ब्लिंक कर रहा है (कोई वास्तविक निर्धारण नहीं)

यह आसानी से किया जाता है

LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean gps_on = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);

यह देखने के लिए कि क्या आपके पास एक ठोस फिक्स है, चीजों को थोड़ा पेचीदा हो जाता है:

public class whatever extends Activity {
    LocationManager lm;
    Location loc;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        lm = (LocationManager) getSystemService(LOCATION_SERVICE);
        loc = null;
        request_updates();        
    }

    private void request_updates() {
        if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            // GPS is enabled on device so lets add a loopback for this locationmanager
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, locationListener);
        }      
    }

    LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            // Each time the location is changed we assign loc
            loc = location;
        }

         // Need these even if they do nothing. Can't remember why.
         public void onProviderDisabled(String arg0) {}
         public void onProviderEnabled(String provider) {}
         public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

अब जब भी आप देखना चाहें कि क्या आपके पास ठीक है?

if (loc != null){
    // Our location has changed at least once
    blah.....
}

यदि आप कल्पना करना चाहते हैं, तो आप हमेशा System.currentTimeMillis () और loc.getTime () का उपयोग करके टाइमआउट कर सकते हैं

मज़बूती से काम करता है, कम से कम 2.1 के बाद से एन 1 पर।


3
आपका समाधान यह क्या करता है के लिए overcomplex है। हालाँकि यह बहुत कम करता है। क्या होगा अगर gps मेरे स्थान को हल करता है, तो मैं भूमिगत स्टेशन पर जाता हूं, जिससे gps फिक्स हो जाता है?
मेन्ड्रे

1

LocationManager के साथ आप getBestProvider () के बाद getLastKnownLocation () प्राप्त कर सकते हैं। यह आपको एक लोकेशन ऑब्जेक्ट देता है, जिसमें UTC मिलीसेकंड में तरीके getAccuracy () मीटर में और getTime () हैं

क्या यह आपको पर्याप्त जानकारी देता है?

या शायद आप LocationProviders पर पुनरावृति कर सकते हैं और यह पता लगा सकते हैं कि क्या प्रत्येक व्यक्ति क्राइटेरिया (ACCURACY_AARARS)


1

इतने सारे पद ...

GpsStatus.Listener gpsListener = new GpsStatus.Listener() {
                        public void onGpsStatusChanged(int event) {
                            if( event == GpsStatus.GPS_EVENT_FIRST_FIX){
                                showMessageDialog("GPS fixed");
                            }
                        }
                 };

इस कोड को जोड़ने के साथ, addGpsListener ... showMessageDialog ... बस स्ट्रिंग के साथ एक मानक संवाद विंडो दिखाता है

मेरे लिए पूरी तरह से काम किया :) बहुत बहुत धन्यवाद: =) (इस पोस्ट के लिए sry, अभी तक वोट करने में सक्षम नहीं)


यह सिर्फ पहला फिक्स है। यदि आप एक सुरंग में प्रवेश करते हैं तो क्या होगा?
लेओस लिटरक

1

यदि आपको ठीक खो जाने के तुरंत बाद अपडेट की आवश्यकता नहीं है, तो आप स्टीफन डे के समाधान को इस तरह से संशोधित कर सकते हैं, कि आपके पास एक ऐसा तरीका है जो यह जाँचता है कि यह फिक्स मौजूद है या नहीं।

जब भी आपको कुछ GPS डेटा की आवश्यकता हो, और आप GpsStatus.Listener की आवश्यकता नहीं है, तो आप इसे देख सकते हैं।

"वैश्विक" चर हैं:

private Location lastKnownLocation;
private long lastKnownLocationTimeMillis = 0;
private boolean isGpsFix = false;

यह वह विधि है जिसे अद्यतन समय और वर्तमान स्थान को याद रखने के लिए "onLocationChanged ()" कहा जाता है। इसके अलावा कि यह "GGFFix "अपडेट करता है:

private void handlePositionResults(Location location) {
        if(location == null) return;

        lastKnownLocation = location;
        lastKnownLocationTimeMillis = SystemClock.elapsedRealtime();

        checkGpsFix(); // optional
    }

जब भी कोई जीपीएस फिक्स हो, तो मुझे यह जानने की जरूरत है कि विधि क्या है:

private boolean checkGpsFix(){

    if (SystemClock.elapsedRealtime() - lastKnownLocationTimeMillis < 3000) {
        isGpsFix = true;

    } else {
        isGpsFix = false;
        lastKnownLocation = null;
    }
    return isGpsFix;
}

मेरे कार्यान्वयन में मैं पहली बार checkGpsFix () चलाता हूं और यदि परिणाम सही है तो मैं अपनी वर्तमान स्थिति के रूप में चर "lastKnownLocation" का उपयोग करता हूं।


1

मुझे पता है यह थोड़ी देर है। हालांकि अगर आप एक तय करना चाहते हैं तो NMEAListener का उपयोग क्यों न करें। मैंने जो पढ़ा है, उसमें से NMEAListener आपको NMEA वाक्य देगा और वहाँ से आप सही वाक्य चुनेंगे।

RMC वाक्य में फिक्स स्थिति है जो चेतावनी के लिए या तो ठीक है या V के लिए A है। GGA वाक्य में फिक्स क्वालिटी (0 अमान्य, 1 GPS या 2 DGPS) शामिल हैं

मैं आपको कोई जावा कोड नहीं दे सकता क्योंकि मैं केवल एंड्रॉइड के साथ शुरुआत कर रहा हूं, लेकिन मैंने विंडोज़ ऐप्स के लिए सी # में एक जीपीएस लाइब्रेरी की है, जिसे मैं ज़मरीन के साथ उपयोग करना चाहता हूं। मैं केवल इस सूत्र के पार आया क्योंकि मैं प्रदाता जानकारी की तलाश में था।

अब तक मैंने जो भी पढ़ा है वह स्थान ऑब्जेक्ट के बारे में है जो मैं गेटअक्यूरेसी () और हैसक्वायरसी () जैसी विधियों के बारे में सहज नहीं हूं। मैं NMEA वाक्य HDOP और VDOP मूल्यों से निकालने के लिए उपयोग किया जाता हूं यह निर्धारित करने के लिए कि मेरे सुधार कितने सटीक हैं। इसका ठीक होना एक आम बात है, लेकिन एक घटिया एचडीओपी है जिसका मतलब है कि आपकी क्षैतिज सटीकता बिल्कुल भी अच्छी नहीं है। उदाहरण के लिए, अपने डेस्क पर बैठे एक बाहरी ब्लूटूथ जीपीएस डिवाइस के साथ डिबगिंग एक खिड़की के खिलाफ कठिन है, आपको एक ठीक होने की संभावना है, लेकिन बहुत खराब एचडीओपी और वीडीओपी। अपने जीपीएस डिवाइस को बाहर या कुछ इसी तरह के फ्लावर पॉट में रखें या जीपीएस में एक बाहरी एरियल जोड़ें और तुरंत आपको अच्छा एचडीओपी और वीओपीओपी मान मिल जाता है।


0

हो सकता है कि नियमित रूप से प्राप्त स्थान को एक निश्चित मान (शून्य) के लिए सेट करने वाले टिमरटेक को बनाने के लिए सबसे अच्छा अवसर हो। यदि GPSListener द्वारा एक नया मान प्राप्त किया जाता है तो यह वर्तमान डेटा के साथ स्थान को अपडेट करेगा।

मुझे लगता है कि यह एक कार्यशील समाधान होगा।


0

आप कहते हैं कि आपने पहले ही onStatusChanged () की कोशिश की, लेकिन यह मेरे लिए काम करता है।

यहाँ मैं विधि का उपयोग करता हूं (मैंने कक्षा को स्वयं ऑनस्टैटसचेंज को संभालने दिया):

private void startLocationTracking() {
    final int updateTime = 2000; // ms
    final int updateDistance = 10; // meter
    final Criteria criteria = new Criteria();
    criteria.setCostAllowed(false);
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    final String p = locationManager.getBestProvider(criteria, true);
    locationManager.requestLocationUpdates(p, updateTime, updateDistance,
            this);
}

और मैं इस तरह से onStatusChanged को संभालता हूं:

void onStatusChanged(final String provider, final int status,
        final Bundle extras) {
    switch (status) {
    case LocationProvider.OUT_OF_SERVICE:
        if (location == null || location.getProvider().equals(provider)) {
            statusString = "No Service";
            location = null;
        }
        break;
    case LocationProvider.TEMPORARILY_UNAVAILABLE:
        if (location == null || location.getProvider().equals(provider)) {
            statusString = "no fix";
        }
        break;
    case LocationProvider.AVAILABLE:
        statusString = "fix";
        break;
    }
}

ध्यान दें कि onProvider {Dis, En} abled () तरीके उपयोगकर्ता द्वारा जीपीएस ट्रैकिंग को सक्षम और अक्षम करने के बारे में हैं; वह नहीं जो आप ढूंढ रहे हैं।


दुर्भाग्य से, यह अक्सर काम नहीं करता है। onLocationChanged () को सेकंड में एक बार कॉल किया जाता है, लेकिन onStatusChanged को कॉल नहीं किया जाता है। कभी-कभी मैं चाहता हूं कि मैं एक अधिसूचना की प्रतीक्षा करने के बजाय केवल वर्तमान स्थिति को क्वेरी कर सकता हूं जो लंबे समय तक, या कभी भी नहीं आ सकती है।
एडवर्ड फॉक

2
सही। मैंने उस पिछले उत्तर के बाद खुद कुछ चीजें सीखी हैं, और एक यह है कि सभी एंड्रॉइड प्लेटफ़ॉर्म एक जैसे नहीं बने हैं। मैं निश्चित रूप से मेरे HTC हीरो और मेरे Archos 5 दोनों पर onStatusChanged कॉल देखता हूं, लेकिन मुझे आश्चर्य नहीं है कि यह हर जगह काम नहीं करता है। योजना बी के बारे में: आप GPSStatusListener का उपयोग करते हैं जो किसी अन्य उत्तर में दिखाया गया है, और बस यह देखें कि क्या उपग्रहों में से कोई भी इस्तेमाल किए गए InFix () के लिए सही है या नहीं। मेरे अनुभव में जो मानक जीपीएस आइकन के व्यवहार के सबसे करीब आता है। (क्या आपने उस स्रोत को खोजने की कोशिश की है जो मानक आइकन, BTW लागू करता है?)
CvR

0

फिक्स के लिए जाँच करने के लिए समय अंतराल सेट करना एक अच्छा विकल्प नहीं है .. मैंने देखा कि onLocationChanged को कॉल नहीं किया जाता है यदि आप आगे नहीं बढ़ रहे हैं .. तो क्या समझ में आता है क्योंकि स्थान नहीं बदल रहा है :)

उदाहरण के लिए बेहतर तरीका होगा:

  • पिछले स्थान पर प्राप्त अंतराल (gpsStatusChanged में) की जाँच करें
  • यदि वह अंतराल 15s सेट चर से अधिक है: long_interval = true
  • स्थान श्रोता को हटा दें और इसे फिर से जोड़ें, आमतौर पर तब आपको अद्यतन स्थिति मिलती है यदि स्थान वास्तव में उपलब्ध है, यदि नहीं - तो आपने शायद स्थान खो दिया है
  • onLocationChanged में आपने झूठी के लिए long_interval सेट किया है ..
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.