2010-06-25 13 views
9

मेरा ऐप किसी विशिष्ट समय पर जांचता है कि कोई उपयोगकर्ता किसी दिए गए स्थान पर है या नहीं। मैं अलार्म प्रबंधक का उपयोग एक सेवा इस कॉल करता है कि शुरू करने के लिए:एंड्रॉइड - विश्वसनीय रूप से वर्तमान स्थान प्राप्त करना

locationManager.requestLocationUpdates(bestProvider, 0, 0, listener); 

और यह भी जाँच करता है:

locationManager.getLastKnownLocation(bestProvider); 

लेकिन मैं समस्या आ रही है जब एक असली डिवाइस पर चल रहा। एक बात के लिए, getLastKnownLocation सबसे अधिक संभावना है कि जीपीएस चालू था, जो कहीं भी हो सकता है (यानी, यह उपयोगकर्ता के वर्तमान स्थान से मील हो सकता है)। तो मैं बस requestLocationUpdates कॉलबैक की प्रतीक्षा करूंगा, और यदि वे दो मिनट के भीतर नहीं हैं, तो श्रोता को हटा दें और छोड़ दें, है ना?

गलत, क्योंकि यदि उपयोगकर्ता का स्थान पहले से ही स्थिर है (यानी, उन्होंने हाल ही में जीपीएस का उपयोग किया है और स्थानांतरित नहीं किया है) तो मेरे श्रोता को कभी नहीं कहा जाएगा क्योंकि स्थान नहीं बदलेगा। लेकिन जीपीएस तब तक चलेगा जब तक कि मेरा श्रोता हटा नहीं जाता है, बैटरी को निकाला जाता है ...

वर्तमान स्थान के लिए पुराना स्थान गलत किए बिना वर्तमान स्थान प्राप्त करने का सही तरीका क्या है? मुझे कुछ मिनट इंतजार नहीं है।

संपादित करें: यह संभव है कि मैं श्रोताओं के बारे में गलत हूं, मुझे लगता है कि यह सोचने से थोड़ा लंबा समय ले सकता है ... कहना मुश्किल है। मैं अभी भी एक निश्चित उत्तर की सराहना करता हूं।

उत्तर

5

कोड ऐसा ही कुछ हो सकता है:

public class MyLocation { 
    Timer timer1; 
    LocationManager lm; 

    public boolean getLocation(Context context) 
    { 
     lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); 
     timer1=new Timer(); 
     timer1.schedule(new GetLastLocation(), 20000); 
     return true; 
    } 

    LocationListener locationListenerGps = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      timer1.cancel(); 
      lm.removeUpdates(this); 
      //use location as it is the latest value 
     } 
     public void onProviderDisabled(String provider) {} 
     public void onProviderEnabled(String provider) {} 
     public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    class GetLastLocation extends TimerTask { 
     @Override 
     public void run() { 
      lm.removeUpdates(locationListenerGps); 
      Location location=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
      //use location as we have not received the new value from listener 
     } 
    } 
} 

हम श्रोता शुरू करने और (मेरे उदाहरण में 20 सेकंड) कुछ समय के लिए अद्यतन के लिए प्रतीक्षा करें। अगर हम इस समय अपडेट प्राप्त करते हैं तो हम इसका इस्तेमाल करते हैं। अगर हमें इस समय अपडेट प्राप्त नहीं होता है तो हम getLastKnownLocation मान का उपयोग करते हैं और श्रोता को रोकते हैं।

आप मेरा पूरा कोड यहाँ What is the simplest and most robust way to get the user's current location on Android?

संपादित करें (प्रश्नकर्ता द्वारा) देख सकते हैं: इस उत्तर के सबसे अधिक है, लेकिन मेरी अंतिम समाधान एक टाइमर के बजाय एक Handler उपयोग करता है।

+0

क्या आप कुछ उदाहरण कोड प्रदान कर सकते हैं? उदाहरण के लिए, यदि स्थान श्रोता को कॉल नहीं किया जाता है, तो आप 2 मिनट या ऐसा कुछ कैसे इंतजार करेंगे? – noah

+0

जोड़ा गया कोड स्निपेट – Fedor

4

यदि उपयोगकर्ता का स्थान पहले से ही स्थिर है, तो getLastKnownLocation वर्तमान स्थान लौटा देगा। मैं पहले getLastKnownLocation पर कॉल करूंगा, टाइमस्टैम्प देखें (Location.getElapsedRealTimeNanos()SystemClock.elapsedRealTimeNanos() के साथ तुलना करें) फिर फिक्स बहुत पुराना होने पर श्रोता पंजीकृत करें।

+0

धन्यवाद, मुझे getTime() के बारे में पता नहीं था। इस के साथ समस्या यह है कि स्थान प्रदाता इसे बहुत पुराना मानने से पहले कितना पुराना होना चाहिए? मैं कैसे गारंटी दे सकता हूं कि अगर मैं उस स्थान का उपयोग नहीं करता तो मेरे श्रोता को बुलाया जाएगा? – noah

+1

स्थान प्रदाता यह बहुत पुराना नहीं मानता है, यह कभी भी इसे छोड़ देता है (जहां तक ​​मुझे पता है)। आपको तय करना होगा कि जब आप फिक्स मानते हैं तो बहुत पुराना है और यदि आवश्यक हो तो अपडेट का अनुरोध करें। फिर भी यदि आप किसी दिए गए समय में कोई अपडेट नहीं करते हैं तो भी आप पुराने स्थान का उपयोग कर सकते हैं। – cristis

+2

यहां एक छोटी सी समस्या है: API स्थान.getTime() द्वारा लौटाए गए टाइमस्टैम्प की उत्पत्ति को परिभाषित नहीं करता है। जीपीएस के लिए, यह उपग्रह समय लगता है। नेटवर्क प्रदाता के लिए, यह स्थानीय डिवाइस का समय लगता है। इससे किसी स्थान की आयु को विश्वसनीय रूप से निर्धारित करना मुश्किल हो जाता है - यह माना जाता है कि उपयोगकर्ता की घड़ी गलत हो सकती है या टाइमज़ोन गलत कॉन्फ़िगर किया जा सकता है। – sstn

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