getLastKnownLocation रिक्त हो जाता है


84

मैंने इस बारे में कुछ प्रश्न पढ़े हैं, लेकिन मुझे ऐसा उत्तर नहीं मिला जिसकी मुझे आवश्यकता थी।

तो, मामला यह है कि मेरे पास मेरा नक्शा सेट है, और मैं अपने वर्तमान जीपीएस स्थान को हथियाना चाहता हूं। मैंने जाँच की है कि मेरे चर NULL नहीं हैं लेकिन फिर भी मेरा परिणाम है:

getLastKnownLocation(provider, false);

हालांकि मुझे अशक्त कर देता है, इसलिए यह वह जगह है जहां मुझे मदद की आवश्यकता है। मैंने COARSE + FINE स्थान के लिए अनुमतियाँ जोड़ी हैं। लेकिन मैं आमतौर पर अपने फोन के लिए सभी प्रकार के नेटवर्क डेटा को अक्षम कर देता हूं, क्योंकि मैं अपने फोन बिल में अप्रत्याशित डेटाफ्लो खर्चों के बारे में बहुत खुश नहीं हूं। इसलिए मेरे पास इस परीक्षण के लिए केवल वाईफाई सक्षम और जुड़ा हुआ है।

क्या ऐसा करने के लिए सक्षम होने के लिए मुझे और कुछ चाहिए? मुझे लगता है कि वाईफाई पर्याप्त होना चाहिए?


आप नए एपीआई और पुराने के लिए मिल रहे हैं पुराने लेक्लोकास्ट इस stackoverflow.com/a/48033659/4997704
Binesh Kumar

यह जवाब पढ़ने लायक है: stackoverflow.com/a/38794291/5319831
मोहम्मद नावेद

जवाबों:


194

अंतिम ज्ञात स्थान प्राप्त करने के लिए इस विधि का उपयोग करें:

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

private Location getLastKnownLocation() {
    mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
    List<String> providers = mLocationManager.getProviders(true);
    Location bestLocation = null;
    for (String provider : providers) {
        Location l = mLocationManager.getLastKnownLocation(provider);
        if (l == null) {
            continue;
        }
        if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
            // Found best last known location: %s", l);
            bestLocation = l;
        }
    }
    return bestLocation;
}

1
यह पता चला कि मेरे पास यह सब सही था, मैंने बस एक त्रुटि देखी कि मुझे इसका हल मिल गया। जीपीएस के लिए Google स्थिति की अनुमति देने के लिए मेरे पास मेरा फोन सेट नहीं था। तो हाँ। धन्यवाद वैसे भी =)
अलेक्जेंडर फिम्रेइट

1
महान कार्यान्वयन, बहुत लचीला। धन्यवाद!
एलेक्सवैल

2
एक जादू की तरह काम करता है। धन्यवाद!
एरियन यानेरस

1
फ़ोन में स्थान सक्षम करें।
थरकनरिमाना

17
प्रश्न के बारे में है getLastKnownLocation returns null... यह कोड कुछ भी नहीं बदलेगा ... यदि सभी प्रदाताओं के लिए mLocationManager.getLastKnownLocation (जैसा कि यह अशक्त लौट सकता है) तो यह अभी भी अशक्त लौटेगा ... उत्तर है ... क्षमा करें आप इससे बच नहीं सकते ... यदि आप वास्तव में चाहते हैं स्थान का उपयोग नहीं करते getLastKnownLocation
सेल्विन

32

जब आप नया और पुराना स्थान एपीआई को एक साथ मिला रहे हों, तब आपको मिलाना चाहिए।

पिछले ज्ञात स्थान को प्राप्त करने के लिए आपको केवल कॉल करना होगा

compile "com.google.android.gms:play-services-location:11.0.1"
mLocationClient.getLastLocation();

एक बार स्थान सेवा से जुड़ा था।

नया स्थान API का उपयोग करने का तरीका पढ़ें

http://developer.android.com/training/location/retrieve-current.html#GetLocation

 private void getLastLocationNewMethod(){
    FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    mFusedLocationClient.getLastLocation()
            .addOnSuccessListener(new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    // GPS location can be null if GPS is switched off
                    if (location != null) {
                        getAddress(location);
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d("MapDemoActivity", "Error trying to get last GPS location");
                    e.printStackTrace();
                }
            });
}

4
यह इंगित करने के लिए धन्यवाद कि नया एपीआई है। यह स्वीकृत उत्तर होना चाहिए।
वायलेट जिराफ

बहुत बहुत धन्यवाद इस एपीआई बहुत तेजी से धन्यवाद आदमी है मुझे नहीं पता था कि यह मौजूद है
Tabish

1
स्थान यहाँ भी अशक्त है। क्या कारण हो सकता है?
जॉली रेंजर

1
स्थान की अनुमति की जाँच करें
Binesh Kumar

सहमत ... यह स्वीकृत उत्तर होना चाहिए। धन्यवाद।
निकोला सलवारो

7

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


ठीक है, तो मुझे अपने कैश के निर्माण की आवश्यकता है? जब मेरा ऐप इसकी वजह से क्रैश होता है तो मैं कैसे कर सकता हूं?
अलेक्जेंडर फिम्रेइट

1
आपको स्थान श्रोता की onLocationChanged विधि का उपयोग करना होगा। एक वैध फिक्स होने में समय लगता है (कुछ मिनट)
सागर मैय्यद

ठीक है धन्यवाद। जब तक मैं इसे एक लॉग को पॉपिंग करते हुए नहीं देखूँगा, मैं चारों ओर
फ़िदा हो जाऊँगा

3
क्या मुझे इसके साथ घूमने की आवश्यकता है, भले ही इसके पास कुछ भी संग्रहीत न हो?
अलेक्जेंडर फिम्रेइट

1

इस कोड को जोड़ें

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
     return;
}

समारोह से पहले :

locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener()) साथ ही समारोह: locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)


1

यह कोशिश करो कि यह मेरे लिए अच्छा काम करे: -

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

        private Location getLastKnownLocation() {
            Location oldLoc;
            while (true){
                oldLoc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (oldLoc == null){
                    continue;
                }
                else {
                    break;
                }
            }
            return oldLoc;
        }

तेज परिणामों के लिए आप GPS_PROVIDER के स्थान पर NETWORK_PROVIDER का उपयोग कर सकते हैं ..


0

मुझे Xamarin में यह समस्या थी। और थायराइड।

Location location = locationManager.GetLastKnownLocation(provider);शून्य मान लौट रहा था। मैंने अपना कोड चेक किया और मुझे पता चला कि मैंने ACCESS_COARSE_LOCATION के लिए केवल अनुरोध किया था। मैंने ACCESS_FINE_LOCATION के लिए अनुमति का अनुरोध करने के लिए कोड जोड़ा और अब यह शून्य नहीं लौट रहा था। यहाँ मेरा कोड है:

void AskPermissions()
{
    if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) != (int)Permission.Granted ||
            CheckSelfPermission(Manifest.Permission.AccessFineLocation) != (int)Permission.Granted)
        RequestPermissions(new string[] { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation }, 0);
    else
        GetLocation();
}

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) == (int)Permission.Granted &&
            CheckSelfPermission(Manifest.Permission.AccessFineLocation) == (int)Permission.Granted)
        GetLocation();
    else
        Log.Info(tag, "Permission not Granted: Please enter desired Location manually.");
}

void GetLocation()
{
    locationManager = (LocationManager)GetSystemService(LocationService);
    provider = locationManager.GetBestProvider(new Criteria(), false);
    Location location = locationManager.GetLastKnownLocation(provider);
    if (location != null)
        Log.Info(tag, "Location Lat: " + location.Latitude + " Lon: " + location.Longitude);
    else
        Log.Info(tag, "Location is null");
}

मामले में Xamarin.Android (C #) से आने वाले किसी को भी यह उपयोगी लगेगा। जावा या एंड्रॉइड स्टूडियो के लिए कोड कुछ मामूली सिंटैक्स परिवर्तनों के साथ समान GetLastKnownLocation()होगा जैसे getLastKnownLocation()जावा में विधि के नाम लोअरकेस अक्षरों से शुरू होते हैं जबकि सी # विधि के नाम अपरकेस अक्षरों से शुरू होते हैं।


0

मुझे स्थान अपडेट करने का यह समाधान पसंद आया:

स्थान अपडेट करें

फिर से शुरू में, शर्त जोड़ें:

Location myLocation = getLastKnownLocation();
if (myLocation == null) {
      locationManager.requestLocationUpdates(
      LocationManager.PASSIVE_PROVIDER,
      MIN_TIME_BW_UPDATES,
      MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
      Log.d("GPS", "GPS Enabled");
 }

और शायद कुछ बुनियादी है, लेकिन जाँच करें कि GPS चालू है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.