2013-03-26 7 views
6

से सटीक वर्तमान स्थान प्राप्त मैं निम्नलिखित कोड का उपयोग अपने आवेदन में एक नेटवर्क प्रदाता से वर्तमान स्थान प्राप्त करने के लिए:नेटवर्क प्रदाता

LocationManager mgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
boolean network_enabled = mgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
if(network_enabled){ 
Location location = mgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

लेकिन यह एक स्थान मेरे वास्तविक स्थान से लगभग 300-700 मीटर की दूरी पर देता है।

यह नेटवर्क प्रदाता से अपेक्षा की जाती है। लेकिन समस्या यह है:

केवल इस नेटवर्क प्रदाता सक्षम के साथ है, और कोई जीपीएस, मैं Foursquare आवेदन जहां यह मेरे वर्तमान स्थान वास्तव में पता चलता है मैं कहाँ हूँ openned। अब जब मैं अपने आवेदन पर वापस आऊंगा, तो यह सटीक वर्तमान स्थान दिखाता है या वही स्थान कहता है जो फोरस्क्वेयर दिखाया गया है।

यही बात नेविगेटर की तरह Google एप्लिकेशन के साथ होता है, नक्शे आदि ..,

यह कैसे किया जा सकता है? नेटवर्क प्रदाता के आधार पर अन्य ऐप्स सटीक स्थान कैसे प्राप्त कर सकते हैं?

पूरा कोड:

public class MyLocationActivity extends Activity implements LocationListener { 
    private LocationManager mgr; 
    private String best; 
    Location location; 
    public static double myLocationLatitude; 
    public static double myLocationLongitude; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
     Criteria criteria = new Criteria(); 
     best = mgr.getBestProvider(criteria, true); 
     location = mgr.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     dumpLocation(location); 
    } 

    public void onLocationChanged(Location location) { 

     dumpLocation(location); 
    } 

    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void onPause() { 

     super.onPause(); 
     mgr.removeUpdates(this); 
    } 

    @Override 
    protected void onResume() { 

     super.onResume(); 
     mgr.requestLocationUpdates(best, 15000, 10, this); 
    } 

    private void dumpLocation(Location l) { 

     if (l != null){ 

      myLocationLatitude = l.getLatitude(); 
      myLocationLongitude = l.getLongitude(); 
     } 
    } 
} 

आप

+0

यदि आप एंड्रॉइड 4.2 का उपयोग कर रहे हैं तो एंड्रॉइड के पिछले संस्करणों की तुलना में, यदि आपका ऐप ACCESS_COARSE_LOCATION अनुमति का अनुरोध करता है तो उपयोगकर्ता स्थान के परिणाम कम सटीक हो सकते हैं लेकिन ACCESS_FINE_LOCATION अनुमति का अनुरोध नहीं करते हैं। जब आपकी ऐप मोटे स्थान (और ठीक स्थान नहीं) के लिए अनुमति का अनुरोध करती है तो उपयोगकर्ताओं की गोपनीयता अपेक्षाओं को पूरा करने के लिए, सिस्टम उपयोगकर्ता स्थान अनुमान प्रदान नहीं करेगा जो कि शहर ब्लॉक से अधिक सटीक है। –

+0

मैंने इसे '4.1.2' पर आज़माया। लेकिन वैसे भी मैं 'ACCESS_COARSE_LOCATION' और' ACCESS_FINE_LOCATION' अनुमति दोनों के लिए पूछ रहा हूं। –

+0

क्या आप अपडेट के बीच समय को कम करने का प्रयास कर सकते हैं? क्या बाद के स्थान पहले लोगों की तुलना में अधिक सटीक भेजे गए हैं? –

उत्तर

3

धन्यवाद तुम सिर्फ अंतिम ज्ञात स्थान मिल रहा है। आपको LocationManager से स्थान अपडेट का अनुरोध करना चाहिए। LocationManager.getLocationUpdates का प्रयोग करें।

पर अपने LocationListeneronLocationChanged(Location location) पद्धति पर, आप Location वस्तु पर जांच कर सकते हैं, यह स्थान कितना सही है, इस तरह:

float accuracy=location.getAccuracy(); 
तो

, अगर यह Location आप के लिए पर्याप्त पूर्ण हैं, आप को रोक सकता है LocationManager से removeUpdates() का उपयोग करके स्थान अपडेट प्राप्त करना, और प्राप्त Location का उपयोग करें। यदि Location पर्याप्त सटीक नहीं है, तो आप अधिक सटीक Location के लिए प्रतीक्षा कर सकते हैं, और बाद वाले अपडेट को रोक सकते हैं।

+0

क्षमा करें कि प्रश्न में कोड का केवल एक हिस्सा है। असल में मेरे पास 'लोकेशन लिस्टर' है जो ** अपडेट अपडेट करता है ** और 'ऑनलाक्शन चेंज' लागू करता है। जो 'mgr.requestLocationUpdates (LocationManager.NETWORK_PROVIDER, 15000, 10, यह) है;' –

+0

पूर्ण कोड प्रदान क्यों नहीं करें ...? –

+0

किया गया। मेरे पास पूरा कोड जोड़ा गया है –

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