2016-02-17 4 views
10

तक मैंने गलत स्थान प्राप्त किया है, मैंने एक एप्लिकेशन विकसित किया है जिसका उपयोग डिवाइस के वर्तमान स्थान को खोजने के लिए किया जाता है। मैंने वर्तमान स्थान प्राप्त करने के लिए फ़्यूज्ड लोकेशन एपीआई का उपयोग किया है।खुले इनबिल्ट Google Map अनुप्रयोग

मुझे कुछ अजीब मुद्दे का सामना करना पड़ रहा है, कुछ उपकरणों में मुझे सटीक वर्तमान स्थान नहीं मिल रहा है जब तक कि मैं Google मानचित्र खोलता हूं, एक बार जब मैं Google मानचित्र खोलता हूं और उस समय मेरे आवेदन पर वापस लौटाता हूं तो एप्लिकेशन सही स्थान लौटाता है।

यहां मेरा स्थान अनुरोध है।

mLocationRequest = new LocationRequest(); 
mLocationRequest.setInterval(UPDATE_INTERVAL); 
mLocationRequest.setFastestInterval(FATEST_INTERVAL); 
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
mLocationRequest.setSmallestDisplacement(DISPLACEMENT); // 10 meters 

क्या कोई मुझे बता सकता है कि क्या गलत है? आपकी मदद वास्तव में सराहना की है।

+0

अपने LocationRequest क्या है को रोकने के लिए भूल गया नहीं है: मैं व्यक्तिगत रूप से प्रत्येक प्रदाता

if (mLocationManager == null) { LOGGER.info("Location track,start called first time. Creating Location Manager"); mLocationManager = (LocationManager) mContextWeakReference.get() .getSystemService(Context.LOCATION_SERVICE); mLocationHandlerThread = new HandlerThread("LocationThread", Thread.NORM_PRIORITY); mLocationHandlerThread.start(); // Now get the Looper from the HandlerThread // NOTE: This call will block until the HandlerThread gets control and initializes its Looper Looper looper = mLocationHandlerThread.getLooper(); Location networkLastKnownLocation = null; Location gpsLastKnownLocation = null; mGpsLocationListener = new GpsLocationListener(); mNetworkLocationListener = new NetworkLocationListener(); // Register the listener with the Location Manager to receive location updates if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER)) { mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS, mGpsLocationListener, looper); gpsLastKnownLocation = mLocationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); } else { setGpsProviderAvailable(false); } if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)) { networkLastKnownLocation = mLocationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS, mNetworkLocationListener, looper); } setLastKnownLocationDifferentProviders(gpsLastKnownLocation, networkLastKnownLocation); } 

और श्रोताओं हैं के लिए अलग से श्रोताओं रजिस्टर? –

+3

क्या आपको 33k अंक मिल गए हैं। क्या मुझे ठोस मूल्यों का अनुमान लगाना चाहिए? टिप्पणी में नहीं, कृपया इसे प्रश्न में रखें। फोन सेटिंग्स में उच्च सटीकता सक्षम थी? आपको कितने स्थान अपडेट प्राप्त हुए हैं? आपने किस डिवाइस पर परीक्षण किया है? जीएमएस पुस्तकालय का संस्करण क्या उपयोग किया जाता है? कुछ भी जो आप सोच सकते हैं मदद करता है। –

+1

5 साल के लिए एक सदस्य बन गया, अभी भी टिप्पणियों में कोड पोस्ट करें। ओह लड़का ... – 2Dee

उत्तर

3

तो वेज़ और हमने अतीत में फ़्यूज्ड लोकेशन का उपयोग किया और कई समस्याओं का सामना किया। एपीआई टूटा हुआ है। ऐसे कुछ डिवाइस हैं जो इसे ठीक से perf नहीं है। गतिविधि मान्यता जो बहुत रिले लगाती है, काम नहीं कर रही है और कर्मचारियों को सही तरीके से पहचानती है। हम स्थान प्रबंधक API पर वापस स्विच करने के लिए समाप्त होते हैं।

यहाँ

टुकड़ा:

Init स्थान प्रबंधक और विभिन्न धागे पर को भेजी जा सकती शुरू करते हैं।

public class GpsLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     LOGGER.info("Location track ,onLocationChanged location={}", location); 
     switch (location.getProvider()) { 
      case LocationManager.GPS_PROVIDER: 
       if (mLocationManager != null) { 
        mLocationManager.removeUpdates(mNetworkLocationListener); 
       } 
       break; 
     } 
     setLastKnownLocation(location); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     LOGGER.info("onStatusChanged: {}, status: {}", provider, status); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     LOGGER.info("onProviderEnabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(true); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     LOGGER.info("onProviderDisabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(false); 
     } 
    } 
} 

public class NetworkLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     LOGGER.info("Location track ,onLocationChanged location={}", location); 
     switch (location.getProvider()) { 
      case LocationManager.NETWORK_PROVIDER: 
       setLastKnownLocation(location); 
       break; 
     } 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     LOGGER.info("onStatusChanged: {}, status: {}", provider, status); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     LOGGER.info("onProviderEnabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(true); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     LOGGER.info("onProviderDisabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(false); 
     } 
    } 
} 

अपंजीकृत और सभी धागे :)

+0

क्या मुझे हमेशा इस श्रोता के लिए अलग धागा चाहिए? मेरा उपयोगकर्ता अपेक्षाकृत धीरे-धीरे चलता है, और मुझे उच्च आवृत्ति अपडेट की आवश्यकता नहीं है; साथ ही, स्थान को आगे की प्रक्रिया के लिए आसानी से धक्का दिया जाता है: यूआई थ्रेड पर कुछ भी नहीं फंस जाएगा। –

+0

एक और सवाल: "गलत" स्थान अपडेट को फ़िल्टर करने का तरीका यह संपूर्ण ज्ञान है। –

+1

1. नहीं। इसके लिए आपको अलग थ्रेड की आवश्यकता नहीं है। आप locationChange 2 प्राप्त करने के लिए एक ही यूआई थ्रेड का उपयोग कर सकते हैं 2. यह पूरी कहानी है :) बुरी जगहों को फ़िल्टर करने के लिए पुस्तक लिखने की आवश्यकता है –

0

मुझे इस बारे में निश्चित नहीं है, लेकिन आखिर में मैंने ऐसा कुछ देखा था, उस फोन में समर्पित जीपीएस नहीं था। इसमें केवल एक जीपीएस था।

बहुत समय के लिए चारों ओर घूमने के बाद मुझे एहसास हुआ कि यही कारण है कि मुझे सटीक स्थान नहीं मिल रहा था। लेकिन नक्शे खोलने के बाद, किसी कारण से स्थान सटीक था। Google मानचित्र पर सटीक स्थान लाने के लिए मानचित्रों में निश्चित रूप से अन्य चीजें करता है भले ही फ़ोन में समर्पित जीपीएस न हो। बस डिवाइस और उनके हार्डवेयर चश्मे की जांच करें।

0

स्थानRequest बनाने के दौरान, आपके पास PRIORITY_NO_POWER को सेट प्राथमिकता() होना चाहिए।

PRIORITY_NO_POWER का अर्थ है कि आपके ऐप को तब तक कोई स्थान नहीं मिलेगा जब तक कि फ़ोन में अन्य ऐप ने स्थानों के लिए अनुरोध नहीं किया हो और प्राप्त हो। LocationRequest पर और पढ़ें।

+0

आप दिखाते हैं कि समस्या को विश्वसनीय रूप से * पुन: उत्पन्न किया जा सकता है *, यह कैसे तय किया जा सकता है। –

0

क्या आप लोग मार्शमलो या ऊपर संस्करण डिवाइस पर परीक्षण कर रहे हैं?
लॉलीपॉप से ​​ऊपर के उपकरणों में, आपको रन टाइम पर स्थान अनुमति के लिए अनुरोध करना होगा। इस लिंक का संदर्भ लें http://developer.android.com/training/permissions/requesting.html
तो आपके पास स्थान की अनुमति नहीं होगी, इसलिए यह सटीक स्थान नहीं लौटाएगा, लेकिन जब आप अपना मानचित्र ऐप शुरू करेंगे जिसमें पहले से ही जीपीएस अनुमति है, तो Google Play सेवा में आपका स्थान अपडेट कर देगा। तो आप भी सही स्थान दिखाना शुरू कर देते हैं क्योंकि अंततः स्थान Google Play सेवा से प्राप्त किया जाता है।

+0

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

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