2012-12-11 8 views
5

ठीक है, मैंने खोज और पढ़ने का समय गुच्छा बिताया है, न केवल इस वेबसाइट पर। अधिकांश धागे जीपीएस के साथ सौदा करते हैं या इसे एक एमुलेटर में काम करने की कोशिश करते हैं। Developer.android.com पर प्रलेखन केवल एक बिंदु तक बताता है। मुझे काम करने के लिए एक साधारण चीज़ नहीं मिल सकती है। इस मुद्दे के साथ ज्यादातर लोगों की तरह, मैं बस नेटवर्क प्रदाता से अंतिम ज्ञात स्थान प्राप्त करना चाहता हूं और इसे Google मानचित्र का उपयोग करने के बाद भी नहीं मिलेगा (नेटवर्क प्रदाता का उपयोग करके क्योंकि जीपीएस बंद कर दिया गया था) और यह मुझे दिखाता है सिर्फ 1/8 से 1/4 मील दूर। ठीक है, तो "प्रदाता" (सेल टावर्स/वाई-फाई चालू होने पर) Google मानचित्र के लिए एक फिक्स प्राप्त कर रहा है। मैं अपने ऐप को आजमाता हूं और अंतिम ज्ञात स्थान नहीं प्राप्त कर सकता हूं। मैं इसे मानचित्र में दिखाने की भी कोशिश नहीं कर रहा हूं, मुझे स्थान प्राप्त करने के लिए बटन दबाए जाने के बाद स्क्रीन पर लेट और लंबे निर्देशांक प्रिंट कर रहे हैं। दस्तावेज एक ही गतिविधि से बने अंतिम स्थान के बारे में कुछ भी नहीं कहता है। यह कहता है कि यह निर्दिष्ट प्रदाता से अंतिम ज्ञात स्थान वापस कर देगा। मैं नेटवर्क्स_PROVIDER निर्दिष्ट कर रहा हूं जो दस्तावेज कहता है सेल टावर और वाई-फाई है। (और हाँ, मेरे पास मैनिफेस्ट में शामिल है।)फोन पर नेटवर्क्स_PROVIDER से getLastKnownLocation शून्य

क्या कोई जानता है कि यह कैसे काम करता है? मुझे अभी तक Google साइट पर भी एक अच्छी व्याख्या दिखाई नहीं देनी है। यदि आप नहीं बता सकते हैं, तो मैं निराश हूं। यह स्पष्ट रूप से कुछ है जो मैं कर रहा हूं (या नहीं), इसलिए मैं कुछ भी/किसी को दोषी नहीं ठहरा रहा हूं, लेकिन खुद को, दस्तावेजों को छोड़कर जो मेरी आवश्यकताओं के लिए बहुत कम हो जाता है।

अद्यतन: अब मैं एक स्थान श्रोता का उपयोग कर रहा हूं और एक स्थान प्राप्त कर रहा हूं, मैं अंतिम स्थान मानता हूं। ऐसा लगता है कि किसी स्थान श्रोता के माध्यम से स्थान अपडेट शुरू किए बिना अंतिम स्थान प्राप्त करने में सक्षम होने के लिए तार्किक लगता है, लेकिन मैं नहीं था, और अब मैं एक स्थान श्रोता के साथ हूं।

अब मेरी समस्या यह है कि मुझे स्थान बदलने के लिए स्थान नहीं मिल रहा है। मेरा कोड अभी भी कुछ भी नहीं करता है सिवाय इसके कि श्रोता के माध्यम से स्थान अपडेट प्राप्त करने का प्रयास करें, और अंतिम ज्ञात स्थान को छीनने के लिए बटन दबाएं। Google मानचित्र मुझे दिखाएगा कि मैं कहां हूं, लेकिन मुझे अपने कोड में 20 मील दूर स्थान मिल रहा है। मुझे एक एहसास है कि मुझे एक नया स्थान मिल रहा है, लेकिन मुझे अंतिम/स्थैतिक घोषणाओं का दोषपूर्ण उपयोग हो सकता है जो मुझे उस स्थान को संग्रहीत करने और उस स्थान का उपयोग करने से रोक रहा है जब मुझे इसकी आवश्यकता हो। मेरे मैनिफेस्ट में इंटरनेट और fine_location अनुमतियां हैं, और गतिविधि के लिए xml ठीक काम करता है - यह केवल स्थान के लिए लाइव खोज चालू/बंद करने के लिए एक बटन प्रदान करता है, मैन्युअल रूप से अंतिम अज्ञात स्थानापन्न करने के लिए एक बटन, और अक्षांश और देशांतर प्रदर्शित करने के लिए एक टेक्स्टव्यू। मैंने इसे बहुत लंबे समय से रखने के लिए गैर-अनिवार्यताओं को बाहर करने की कोशिश की है।

public class RMain extends Activity { 

public boolean islivesearchon; 
public static double netlistentime = 0 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds 
public static double netlistendistance = 0 * 1609.344; // miles * conversion to meters 
public static double gpslistentime = 30 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds 
public static double gpslistendistance = 0 * 1609.344; // miles * conversion to meters 

private static Location currentlocation; 
private LocationManager locationManager; 
private LocationListener locationListener; 
public static Criteria criteria; 
public TextView latview; 
public TextView longview; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_rmain); 

    latview = (TextView) findViewById(R.id.display_latitude); 
    longview = (TextView) findViewById(R.id.display_longitude); 

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    // setup bestProvider 
    criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    String bestprovider = locationManager.getBestProvider(criteria, true); 

    // get an initial current location 
    currentlocation = locationManager.getLastKnownLocation(bestprovider); 
    latview.setText(Double.toString(currentlocation.getLatitude())); 
    longview.setText(Double.toString(currentlocation.getLongitude())); 

    // Define locationListener interface 
    locationListener = new LocListener(); 

    // React to LiveSearch toggle button press 
    final Button livesearch = (Button) findViewById(R.id.button_livesearch); 
    livesearch.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      TextView livesearchview = (TextView) findViewById(R.id.button_livesearch); 
      boolean isNetEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
      boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      if(islivesearchon) { 
       locationManager.removeUpdates(locationListener); 
       islivesearchon = false; 
       livesearchview.setText("Live Search is OFF"); 
      } 
      else { 
       // ideally should check for !isProviderEnabled first, then provide option for turning it on 
       if(isNetEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, (long) netlistentime, (float) netlistendistance, locationListener); 
        islivesearchon = true; 
        livesearchview.setText("Live Search is ON"); 
       } 
       // ideally should check for !isProviderEnabled first, then provide option for turning it on 
       if(isGpsEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) gpslistentime, (float) gpslistendistance, locationListener); 
        islivesearchon = true; 
        livesearchview.setText("Live Search is ON"); 
       } 
      } 
     } 
    }); 

    // Respond to Get Location button click to get last known location 
    final Button getlocation = (Button) findViewById(R.id.button_getlocation); 
    getlocation.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      String bestprovider = locationManager.getBestProvider(criteria, true); 
      Location lastlocation = locationManager.getLastKnownLocation(bestprovider); 

      latview.setText(Double.toString(lastlocation.getLatitude())); 
      longview.setText(Double.toString(lastlocation.getLongitude())); 
     } 
    }); 

} 

private class LocListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location latestlocation) { 
     // Called when a new location is found by the network location provider. 
     currentlocation.set(latestlocation); 
     latview.setText(Double.toString(currentlocation.getLatitude())); 
     longview.setText(Double.toString(currentlocation.getLongitude())); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 

    @Override 
    public void onProviderEnabled(String provider) {} 

    @Override 
    public void onProviderDisabled(String provider) {} 
}; 

}

+1

क्या आप अपने फोन के अंदर सिम करते हैं? –

+1

बस एप्लिकेशन को शुरू करने के समय बस किसी भी स्थान को सेट करें, फिर getLastKnownLocation पुनर्प्राप्त करें ... –

+0

धन्यवाद दोस्तों। हां, मैं केवल अपने फोन के अंदर सिम - एक्लिप्स में एमुलेटर हमेशा मेरे लिए ठीक से नहीं चलता है। – crispy

उत्तर

7

इसके साथ जांच करने का प्रयास करें ... एक बार आपका onLocationChange कहा जाता है, उसके बाद पुराने मूल्य जो आप अंतिम ज्ञात स्थान का उपयोग कर प्राप्त कर सकते हैं।

locationManager = (LocationManager)this.getSystemService(LOCATION_SERVICE); 

     location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if (location != null) { 

      old_latitude=location.getLatitude(); 
      old_longitude=location.getLongitude(); 
      Log.d("old","lat : "+old_latitude); 
      Log.d("old","long : "+old_longitude); 

      this.onLocationChanged(location); 
     } 
+0

मैंने अभी तक एक ऑनलोकेशन परिवर्तन विधि भी नहीं डाली है। ऐसा लगता है कि मुझे नेटवर्क्स_PROVIDER से अंतिम ज्ञात स्थान प्राप्त करने में सक्षम होना चाहिए, जैसा कि दस्तावेज़ में वर्णित है, लेकिन मैं इसे भी प्राप्त नहीं कर सकता। अब मैं सिर्फ बाहर निकलने जा रहा हूं और आखिरी, सर्वोत्तम, नवीनतम इत्यादि के आधार पर एक स्थान प्राप्त करने के लिए सभी कोड डाल रहा हूं ... और देखें कि यह कैसा चल रहा है। मैं जावा सीख रहा हूं और यह करने की कोशिश कर रहा है कि दस्तावेज ऐसा करने की कोशिश कर रहा है जो इसे करना चाहिए। मुझे लगता है कि अगर मैं इस सरल कमांड को भी नहीं खींच सकता, तो अन्य सभी स्थान सामग्री को भूल जाओ ... – crispy

+0

केवल एक बार स्थानान्तरण() का उपयोग करें, इसके बाद, आपको हर बार अपना अंतिम ज्ञात स्थान() प्राप्त होगा :)। जब तक स्थान परिवर्तन फिर से नहीं हो जाता है। यह निश्चित रूप से काम करेगा :) – Rahul

4

यह अशक्त 'देता है, जब सेवा नेटवर्क

ताकि अक्सर हो सकता है के माध्यम से में सेटिंग> स्थान और सुरक्षा> स्थान अक्षम है।

+0

धन्यवाद। मेरे फोन में "Google लोकेशन सेवाएं" हैं, जिन्हें "स्टैंडअलोन जीपीएस सेवाएं" चेक किया गया है, जिन्हें वर्तमान में नहीं चुना गया है, और "वीजेडब्लूडब्ल्यू स्थान सेवाएं" (वेरिज़ोन द्वारा प्रदान की जाने वाली स्थान सेवाएं) की जांच की गई है। दोबारा, Google को वाई-फाई के साथ और बिना वाई-फाई के साथ फिक्स मिलेगा, और वाईपीएस नहीं। मैं तुरंत अपने ऐप में जाता हूं और मुझे कोई अंतिम स्थान नहीं मिल सकता - हमेशा 0.0 अक्षांश और 0.0 लंबा। मुझे लगता है कि यह अंतिम स्थान प्रदान करता है कि मेरा ऐप निर्दिष्ट प्रदाता से पुनर्प्राप्त हुआ।मुझे एक और धागा मिला जहां किसी ने सुरक्षा कारणों से संभवतः यह उल्लेख किया। – crispy

+0

कृपया मेरा उत्तर सही करें। और करीबी प्रश्न –

+0

अच्छा जवाब .. मैंने माइक्रोमैक्स और सैमसंग पर इसका परीक्षण किया। उत्तम। – Siddharth

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