मैं एक ऐप लिख रहा हूं जिसके लिए उपयोगकर्ता के वर्तमान स्थान की आवश्यकता है (अंतिम अज्ञात स्थान बहुत उपयोगी नहीं होगा) और डेटाबेस से ली गई सभी निकटतम "वस्तुओं" की एक सूची प्रदर्शित करता है।एंड्रॉइड एक बार जीपीएस स्थान ढूंढता है, लोडिंग संवाद दिखा रहा है
मुझे अच्छी तरह से काम करने वाली सबसे नज़दीकी वस्तुओं की खोज मिल गई है, लेकिन समय के लिए केवल एक हार्डकोडेड अक्षांश और देशांतर स्थान का उपयोग कर रहा है, लेकिन अब यह वास्तविक स्थान खोजने के लिए लागू करने का समय है।
कोई भी इस बात का एक उदाहरण प्रदान कर सकता है कि ऐप को पृष्ठभूमि में वर्तमान ठीक स्थान कैसे ढूंढें और ऐप प्रतीक्षा करें। व्यक्ति को स्थानांतरित होने के बाद मुझे केवल अपडेट की आवश्यकता नहीं होती है। मैंने एक स्थान श्रोता लागू किया है, हालांकि मुझे लगता है कि एक जीपीएस फिक्स धीमा हो सकता है। मैंने अंतिम ज्ञात स्थान का उपयोग करके अन्य स्थान देखे हैं या स्थान श्रोता को कार्यान्वित कर रहे हैं जो चलाना और अपडेट करना जारी रखता है, हालांकि मेरी गतिविधि को स्थान निर्देशांक की आवश्यकता होती है इससे पहले कि यह ऐप को क्रैश कर दे। इसकी खोज करते समय मुझे एक प्रगति संवाद दिखाने की जरूरत है।
पृष्ठभूमि में एक बार स्थानसूचीकर्ता कैसे चला सकता है और फिर स्थान ढूंढने के बाद स्थान अपडेट को हटा सकता है। 20-30 सेकेंड के बाद मुझे जीपीएस स्थान या टाइमआउट होने तक इंतजार करने के लिए शेष एप्लिकेशन की आवश्यकता है। मैं एक प्रोग्रेसडियलॉग अप करना चाहता हूं ताकि उपयोगकर्ता जानता है कि कुछ चल रहा है, लेकिन यह केवल कताई लोडिंग एनीमेशन होना चाहिए जो कि प्रतिशत या कुछ भी नहीं है। यदि संभव हो तो मैं चाहता हूं कि उपयोगकर्ता संवाद को रद्द करने में सक्षम हो, यदि वे प्रतीक्षा करने में बीमार हैं, तो वे इसके बजाय उपनगर टाइप करके खोज सकते हैं।
मैं इसे थ्रेड के साथ करने की कोशिश कर रहा हूं लेकिन मुझे लगता है कि यह होना चाहिए और अभी भी काम नहीं कर रहा है, इससे कहीं अधिक जटिल हो रहा है। आईफोन पर यह बहुत आसान है?
क्या कोई इसे करने का एक अच्छा तरीका प्रदान कर सकता है, मैं इस पर एक सप्ताह के लिए अपने बालों को फेंक रहा हूं और यह वास्तव में मुझे बाकी ऐप पूर्ण होने की तारीख के लिए शेड्यूल के पीछे रख रहा है।
* वर्तमान निर्देशांक
खोजें * दिखाएँ प्रगति संवाद जबकि हो रही स्थान
* एप्लिकेशन सफल स्थान के लिए इंतजार करना या एक निश्चित समय के बाद छोड़ देना सक्षम हो कहें:
सारांश में मैं करना चाहते हैं?
* यदि सफल: प्रगति संवाद को खारिज करें और वस्तुओं को ढूंढने के लिए मेरे अन्य तरीकों को चलाने के लिए निर्देशांक का उपयोग करें।
* यदि स्थान प्राप्त करने में विफल: प्रगति संवाद को खारिज करें और त्रुटि संदेश दिखाएं, और उपयोगकर्ता को खोज गतिविधि पर जाने के लिए मेनू का उपयोग करने के लिए प्रोत्साहित करें।
* उपयोगकर्ता द्वारा मानचित्र से वर्तमान स्थान दिखाने के लिए, मेनू से मानचित्र दृश्य चुनने के लिए इन निर्देशांकों का उपयोग करें और डेटाबेस से उनके निर्देशांक का उपयोग करके सभी आस-पास के आइटमों पर पिन डाले गए हैं।
धन्यवाद दोस्तों, मुझे उम्मीद है कि मैंने खुद को काफी समझाया है। कोई सवाल सिर्फ पूछता है, मैं नियमित रूप से जांच करूँगा क्योंकि मैं इस भाग को पूरा करने के इच्छुक हूं। चीयर्स
संपादित
कोड के रूप में अनुरोध
locationList गतिविधि फ़ाइल
protected void onStart()
{
super.onStart();
// ....
new LocationControl().execute(this);
}
private class LocationControl extends AsyncTask<Context, Void, Void>
{
private final ProgressDialog dialog = new ProgressDialog(branchAtmList.this);
protected void onPreExecute()
{
this.dialog.setMessage("Determining your location...");
this.dialog.show();
}
protected Void doInBackground(Context... params)
{
LocationHelper location = new LocationHelper();
location.getLocation(params[0], locationResult);
return null;
}
protected void onPostExecute(final Void unused)
{
if(this.dialog.isShowing())
{
this.dialog.dismiss();
}
useLocation(); //does the stuff that requires current location
}
}
public LocationResult locationResult = new LocationResult()
{
@Override
public void gotLocation(final Location location)
{
currentLocation = location;
}
};
LocationHelper वर्ग
package org.xxx.xxx.utils;
import java.util.Timer;
/*
imports
*/
public class LocationHelper
{
LocationManager locationManager;
private LocationResult locationResult;
boolean gpsEnabled = false;
boolean networkEnabled = false;
public boolean getLocation(Context context, LocationResult result)
{
locationResult = result;
if(locationManager == null)
{
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
}
//exceptions thrown if provider not enabled
try
{
gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
catch (Exception ex) {}
try
{
networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
catch (Exception ex) {}
//dont start listeners if no provider is enabled
if(!gpsEnabled && !networkEnabled)
{
return false;
}
if(gpsEnabled)
{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
}
if(networkEnabled)
{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
}
GetLastLocation();
return true;
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location)
{
locationResult.gotLocation(location);
locationManager.removeUpdates(this);
locationManager.removeUpdates(locationListenerNetwork);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extra) {}
};
LocationListener locationListenerNetwork = new LocationListener() {
public void onLocationChanged(Location location)
{
locationResult.gotLocation(location);
locationManager.removeUpdates(this);
locationManager.removeUpdates(locationListenerGps);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extra) {}
};
private void GetLastLocation()
{
locationManager.removeUpdates(locationListenerGps);
locationManager.removeUpdates(locationListenerNetwork);
Location gpsLocation = null;
Location networkLocation = null;
if(gpsEnabled)
{
gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
if(networkEnabled)
{
networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
//if there are both values use the latest one
if(gpsLocation != null && networkLocation != null)
{
if(gpsLocation.getTime() > networkLocation.getTime())
{
locationResult.gotLocation(gpsLocation);
}
else
{
locationResult.gotLocation(networkLocation);
}
return;
}
if(gpsLocation != null)
{
locationResult.gotLocation(gpsLocation);
return;
}
if(networkLocation != null)
{
locationResult.gotLocation(networkLocation);
return;
}
locationResult.gotLocation(null);
}
public static abstract class LocationResult
{
public abstract void gotLocation(Location location);
}
}
यह वास्तव में एक बार वर्तमान स्थान प्राप्त करने के लिए एक बड़े प्रयास की तरह लगता है? मुझे अपडेट या कुछ भी चाहिए? क्या परिणाम के लिए एप्लिकेशन का इंतजार करने का कोई आसान तरीका नहीं है? मैं इस पर इतने लंबे समय से अटक गया हूं।
http://stackoverflow.com/questions/3145089/what-is-the-simplest-and-most-robust-way-to-get-the-users-current-location-in-a/9811633#9811633 – Rajal