android - एंड्रॉइड: Google Play Services बनाम स्थान प्रबंधक




gps geolocation (4)

Google Play Services का हिस्सा Google स्थान सेवा API , एक अधिक शक्तिशाली, उच्च स्तरीय ढांचा प्रदान करता है जो स्वचालित रूप से स्थान प्रदाताओं , उपयोगकर्ता आंदोलन और स्थान सटीकता को नियंत्रित करता है । यह आपके द्वारा प्रदत्त पावर खपत पैरामीटर के आधार पर स्थान अपडेट शेड्यूलिंग को भी संभालता है। ज्यादातर मामलों में, आपको स्थान सेवा API का उपयोग करके बेहतर बैटरी प्रदर्शन , साथ ही अधिक उपयुक्त सटीकता मिल जाएगी।

दो एपिस Google Play सेवा स्थान API और Android Framework स्थान API के बीच अधिक विस्तृत अंतर here पाए जा सकते here

मैं एक ऐसा ऐप बनाना चाहता हूं जो उपयोगकर्ता के वर्तमान स्थान को प्राप्त करने के आसपास केंद्रित हो और फिर रुचि के बिंदु (जैसे सलाखों, रेस्तरां इत्यादि) ढूंढें जो Google Places API के माध्यम से उसके करीब हैं।

शुरू करने के लिए किसी वेब के लिए वेब पर खोज करने पर मैं कुछ ट्यूटोरियल्स में आया जो LocationManager क्लास और कुछ अन्य उपयोगकर्ताओं का उपयोग करते हैं जो उपयोगकर्ता स्थान खोजने के लिए Google Play सेवाओं का उपयोग करते हैं।

पहली नजर में दोनों ही एक ही काम करते हैं, लेकिन चूंकि मैं इसके लिए नया हूं, मुझे थोड़ी उलझन में आ गया और मुझे नहीं पता कि मेरी कौन सी विधि मेरी आवश्यकताओं को सर्वोत्तम बनाती है। तो, मैं आपसे पूछना चाहता हूं:

स्थानों को खोजने के इन दो तरीकों के बीच मतभेद क्या हैं (यदि कोई है)?


आपको LocationManager के बजाय Google Play सेवा स्थान api का उपयोग करना चाहिए। दस्तावेज़ों के मुताबिक:

आपके ऐप में स्थान जागरूकता जोड़ने के तरीके के रूप में एंड्रॉइड फ्रेमवर्क स्थान API (android.location) पर Google Play सेवाएं स्थान API को प्राथमिकता दी जाती है। यदि आप वर्तमान में एंड्रॉइड फ्रेमवर्क लोकेशन एपीआई का उपयोग कर रहे हैं, तो आपको जल्द से जल्द Google Play सेवाएं स्थान API पर स्विच करने के लिए प्रोत्साहित किया जाता है।

स्विच करने के लिए, Google यह कहता है:

Google Play Services का हिस्सा Google स्थान सेवा API, एक अधिक शक्तिशाली, उच्च स्तरीय ढांचा प्रदान करता है जो स्वचालित रूप से स्थान प्रदाताओं, उपयोगकर्ता आंदोलन और स्थान सटीकता को नियंत्रित करता है। यह आपके द्वारा प्रदत्त पावर खपत पैरामीटर के आधार पर स्थान अपडेट शेड्यूलिंग को भी संभालता है। ज्यादातर मामलों में, आपको स्थान सेवा API का उपयोग करके बेहतर बैटरी प्रदर्शन, साथ ही अधिक उपयुक्त सटीकता मिल जाएगी।


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

वास्तविक जीवन में मैंने कई सनकी मूल्यों को पॉप अप किया है, वास्तविक स्थिति से 10 किलोमीटर दूर है। एकमात्र स्पष्टीकरण यह है कि ये पागल स्थान गूगल्स वाई-फाई या एनडब्ल्यूके डेटाबेस में त्रुटियों से निकलते हैं - त्रुटियां जो हमेशा वहां रहेंगी, क्योंकि वाई-फाई और नेटवर्क टोपोलॉजी हर दिन बदलती हैं। लेकिन दुर्भाग्य से (और आश्चर्यजनक रूप से) एपीआई आपको कोई जानकारी नहीं देता है कि एक व्यक्तिगत स्थिति कैसे प्राप्त की गई थी।

यह आपको गति, त्वरण, असर इत्यादि पर व्यवहार्यता जांच के आधार पर सनकी मूल्यों को फ़िल्टर करने की समस्याओं के साथ छोड़ देता है।

... या अच्छे पुराने फ्रेमवर्क एपीआई पर वापस जाएं और केवल जीपीएस का उपयोग करें, जो मैंने तब तक करने का फैसला किया जब तक कि Google फ़्यूज्ड एपीआई में सुधार नहीं करता।


एंड्रॉइड पर उपयोगकर्ता स्थान

एंड्रॉइड पर उपयोगकर्ता का स्थान प्राप्त करना आईओएस की तुलना में थोड़ा कम सरल है। भ्रम शुरू करने के लिए, आप इसे दो अलग-अलग तरीके से कर सकते हैं। पहला एंड्रॉइड एपीआई का उपयोग एंड्रॉइड.लोकेशन.लोकेशन लिस्टनर से कर रहा है, और दूसरा Google Play Services APIs com.google.android.gms.location.LocationListener का उपयोग कर रहा है। चलो दोनों के माध्यम से चलो।

  1. एंड्रॉइड का स्थान एपीआई

    एंड्रॉइड के स्थान एपीआई स्थान पाने के लिए तीन अलग-अलग प्रदाताओं का उपयोग करते हैं -

    • LocationManager.GPS_PROVIDER - यह प्रदाता उपग्रहों का उपयोग करके स्थान निर्धारित करता है। शर्तों के आधार पर, इस प्रदाता को स्थान फिक्स वापस करने में कुछ समय लग सकता है।
    • LocationManager.NETWORK_PROVIDER - यह प्रदाता सेल टावर और वाईफाई एक्सेस पॉइंट की उपलब्धता के आधार पर स्थान निर्धारित करता है। नेटवर्क लुकअप के माध्यम से परिणाम पुनर्प्राप्त किए जाते हैं।
    • LocationManager.PASSIVE_PROVIDER - यह प्रदाता अन्य प्रदाताओं द्वारा उत्पन्न स्थानों को वापस कर देगा। जब आप अन्य एप्लिकेशन या सेवाओं को वास्तव में स्थानों का अनुरोध किए बिना अनुरोध करते हैं तो आप निष्क्रिय रूप से स्थान अपडेट प्राप्त करते हैं।

इसका अर्थ यह है कि आपको सिस्टम से LocationManager प्रबंधक का ऑब्जेक्ट मिलता है, requestLocationUpdates लागू करें, और LocationListener requestLocationUpdates पर requestLocationUpdates LocationManager requestLocationUpdates करें।

यहां एक कोड स्निपेट है:

    LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      // Called when a new location is found by the network location provider.
      makeUseOfNewLocation(location);
    }

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

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };

// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

स्थान रणनीतियों पर Google की एपीआई मार्गदर्शिका कोड को अच्छी तरह से बताती है। लेकिन वे यह भी उल्लेख करते हैं कि ज्यादातर मामलों में, आपको Google स्थान सेवा API का उपयोग करके बेहतर बैटरी प्रदर्शन, साथ ही अधिक उचित सटीकता मिल जाएगी। अब भ्रम शुरू होता है!

  1. Google की स्थान सेवा API

Google की स्थान सेवा API Google Play Services एपीके का एक हिस्सा है ( यहां इसे सेट अप करने का तरीका बताया गया है )। वे एंड्रॉइड के एपीआई के शीर्ष पर बने हैं। ये एपीआई ऊपर उल्लिखित प्रदाताओं के बजाय "फ़्यूज्ड स्थान प्रदाता" प्रदान करते हैं। यह प्रदाता स्वचालित रूप से सटीकता, बैटरी उपयोग इत्यादि के आधार पर उपयोग करने के लिए अंतर्निहित प्रदाता का चयन करता है। यह तेज़ है क्योंकि आपको सिस्टम-व्यापी सेवा से स्थान मिलता है जो इसे अपडेट करता रहता है। और आप geofencing जैसे अधिक उन्नत सुविधाओं का उपयोग कर सकते हैं।

Google की स्थान सेवाओं का उपयोग करने के लिए, आपके ऐप को Google GooglePlayServicesClient से कनेक्ट करने की आवश्यकता है। क्लाइंट से कनेक्ट करने के लिए, आपकी गतिविधि (या खंड, या तो) को GooglePlayServicesClient.ConnectionCallbacks और GooglePlayServicesClient.OnConnectionFailedListener इंटरफेस को लागू करने की आवश्यकता है। नमूना कोड यहां दिया गया है:

    public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener {
    LocationClient locationClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        locationClient = new LocationClient(this, this, this);
    }

    @Override
    public void onConnected(Bundle bundle) {
    Location location = locationClient.getLastLocation() ;
        Toast.makeText(this, "Connected to Google Play Services", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDisconnected() {
    Toast.makeText(this, "Connected from Google Play Services.", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        // code to handle failed connection
        // this code can be found here — http://developer.android.com/training/location/retrieve-current.html 
    }
  • LocationClient.getLastLocation locationClient.getLastLocation() शून्य क्यों है?

locationClient.getLastLocation() को क्लाइंट से अंतिम ज्ञात स्थान मिलता है। हालांकि, फ़्यूज्ड स्थान प्रदाता केवल पृष्ठभूमि स्थान बनाए रखेगा यदि कम से कम एक ग्राहक उससे जुड़ा हुआ है। एक बार पहला क्लाइंट कनेक्ट हो जाने पर, यह तुरंत एक स्थान प्राप्त करने का प्रयास करेगा। यदि आपकी गतिविधि कनेक्ट करने वाला पहला ग्राहक है और आप getLastLocation() कनेक्ट getLastLocation() कॉल getLastLocation() , तो हो सकता है कि पहले स्थान के आने के लिए पर्याप्त समय न हो। इसके परिणामस्वरूप location null

इस समस्या को हल करने के लिए, आपको प्रदाता को स्थान प्राप्त होने तक (अनिश्चित रूप से) इंतजार करना होगा और फिर getLastLocation() कॉल getLastLocation() , जो जानना असंभव है। आवधिक स्थान अपडेट प्राप्त करने के लिए com.google.android.gms.location.LocationListener इंटरफ़ेस को कार्यान्वित करना एक और (बेहतर) विकल्प है (और आपको पहला अपडेट मिलने के बाद इसे बंद करें)।

    public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
    // . . . . . . . . more stuff here 
    LocationRequest locationRequest;
    LocationClient locationClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // . . . . other initialization code
        locationClient = new LocationClient(this, this, this);
    locationRequest = new LocationRequest();
    // Use high accuracy
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        // Set the update interval to 5 seconds
    locationRequest.setInterval(UPDATE_INTERVAL);
        // Set the fastest update interval to 1 second
    locationRequest.setFastestInterval(FASTEST_INTERVAL);
    }
    // . . . . . . . . other methods 
    @Override
    public void onConnected(Bundle bundle) {
        Location location = locationClient.getLastLocation();
        if (location == null)
            locationClient.requestLocationUpdates(locationRequest, this);
        else
            Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
    }
    // . . . . . . . . other methods
    @Override
    public void onLocationChanged(Location location) {
        locationClient.removeLocationUpdates(this);
        // Use the location here!!!
    }

इस कोड में, आप जांच रहे हैं कि क्लाइंट के पास पहले से अंतिम स्थान है ( onConnected )। यदि नहीं, तो आप स्थान अपडेट के लिए अनुरोध कर रहे हैं, और जैसे ही आपको अपडेट onLocationChanged() , अनुरोधों को onLocationChanged() कॉलबैक में)।

ध्यान दें कि locationClient.requestLocationUpdates(locationRequest, this); onConnected कॉलबैक के अंदर होना चाहिए, अन्यथा आपको एक IllegalStateException मिलेगा क्योंकि आप Google Play Services क्लाइंट से जुड़े स्थानों के लिए अनुरोध करने का प्रयास करेंगे।

  • उपयोगकर्ता ने स्थान सेवाएं अक्षम कर दी हैं

कई बार, उपयोगकर्ता के पास स्थान सेवाएं अक्षम होती हैं (बैटरी बचाने के लिए, या गोपनीयता कारणों से)। ऐसे मामले में, उपर्युक्त कोड अभी भी स्थान अपडेट के लिए अनुरोध करेगा, लेकिन स्थान पर onLocationChanged पर कभी भी कॉल नहीं किया जाएगा। आप यह जांच कर अनुरोधों को रोक सकते हैं कि उपयोगकर्ता ने स्थान सेवाओं को अक्षम कर दिया है या नहीं।

यदि आपके ऐप को स्थान सेवाओं को सक्षम करने की आवश्यकता है, तो आप एक संदेश या टोस्ट दिखाना चाहते हैं। दुर्भाग्यवश, Google की स्थान सेवा API में उपयोगकर्ता ने स्थान सेवाओं को अक्षम कर दिया है या नहीं, यह जांचने का कोई तरीका नहीं है। इसके लिए, आपको एंड्रॉइड के एपीआई पर वापस जाना होगा।

आपकी onCreate विधि में:

    LocationManager manager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
    locationEnabled = false;
    Toast.makeText(getActivity(), "Enable location services for accurate data", Toast.LENGTH_SHORT).show();
}
else locationEnabled = true;

और इस तरह की onConnected विधि में locationEnabled ध्वज का उपयोग करें:

    if (location != null) {
    Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
else if (location == null && locationEnabled) {
    locationClient.requestLocationUpdates(locationRequest, this);
}

राहुल जिरर्सल का धन्यवाद







geolocation