
शुभ दोपहर, खाबरोवस्क निवासी। आज मैं सामान्य रूप से
लोकेशन एपीआई के बारे में और विशेष रूप से भू-विज्ञान के बारे में बात करना चाहूंगा, जो Google I / 0 2013 (
वीडियो और
प्रस्तुति ) में
प्रस्तुत किए गए थे। इस तथ्य के बावजूद कि घटना छह महीने से अधिक समय तक हुई थी, हब पर इस बारे में अभी भी कोई जानकारी नहीं है (केवल
एक उल्लेख )। मैं स्थिति को थोड़ा ठीक करने की कोशिश करूंगा।
स्थान API क्या हैं?
स्थान एपीआई Google Play सेवाओं का हिस्सा हैं, जो कि डिवाइस के स्थान के साथ काम करने वाले अनुप्रयोगों को बनाने के लिए डिज़ाइन किया गया है।
LocationManager में समान विशेषताओं के विपरीत, इन APIs ने ऊर्जा दक्षता में सुधार किया है। वर्तमान में, निम्न कार्यक्षमता उपलब्ध है: डिवाइस के स्थान को निर्धारित करना, भू-दृश्य और उपयोगकर्ता गतिविधि की मान्यता के साथ काम करना। पोजिशनिंग आपको सटीकता और ऊर्जा की खपत के बीच संतुलन बनाने की अनुमति देता है, और सबसे आम स्थानों तक पहुंच भी प्रदान करता है। गतिविधि को पहचानना आपको यह पता लगाने की अनुमति देता है कि डिवाइस का उपयोगकर्ता क्या करता है: एक कार की सवारी करता है, एक साइकिल की सवारी करता है, चलता है या एक जगह पर है। ठीक है, वास्तव में, जियोफेंस के साथ काम करना आपको संदेश भेजने की अनुमति देता है जब एक उपकरण उपयोगकर्ता एक विशिष्ट क्षेत्र में प्रवेश करता है, इसे छोड़ देता है या एक निश्चित अवधि के लिए क्षेत्र में होता है।
मेरी राय में,
आधिकारिक उदाहरण काफी जटिल और भ्रमित करने वाला है। यह इस तथ्य के कारण है कि:
- स्थान API की सभी विशेषताओं को दिखाने का प्रयास किया गया है
- बहुत सारी टिप्पणियाँ और अपवाद हैंडलिंग जो उदाहरण में याद की जा सकती हैं
- सभी क्रियाएं गतिविधि से की जाती हैं
इसके आधार पर, इस लेख में मैं केवल जियोफेंस पर ध्यान केंद्रित करूंगा और कुछ अपवाद हैंडलिंग को छोड़ दूंगा।
नोट : Google Play सेवाएं डिवाइस पर अक्षम की जा सकती हैं। यह कई अनुप्रयोगों के संचालन को बाधित कर सकता है और सिस्टम उपयोगकर्ता को अक्षम करने से पहले इसके बारे में ईमानदारी से चेतावनी देता है। लेकिन फिर भी,
GooglePlayServicesUtil.isGooglePlayServicesAvailable का उपयोग करके अपने एप्लिकेशन में इसे चेक करना अच्छा है और किसी तरह उपयोगकर्ता को चेतावनी देते हैं।
कार्य
तो, एक उदाहरण के लिए, हम एक आवेदन लिखेंगे जिसमें आप भू-आकृति के निर्देशांक और त्रिज्या को स्पष्ट रूप से निर्दिष्ट कर सकते हैं। जब आप इसे दर्ज करते हैं / बाहर निकलते हैं, तो स्थिति बार में जियोफेंस आईडी और आंदोलन के प्रकार के साथ एक अधिसूचना जोड़ी जाएगी। जियोफेंस छोड़ने के बाद, हम इसे हटा देंगे।
एल्गोरिथ्म
सामान्य तौर पर, प्रक्रिया इस प्रकार है:
- गतिविधि से, हम एक सेवा बनाते हैं जिससे हम जियोफेंस के बारे में डेटा ट्रांसफर करते हैं।
- सेवा स्थान को प्रारंभिक बनाता है।
- जब LocationClient को इनिशियलाइज़ किया जाता है, तो इसमें जियोफेंस और संबंधित लंबित जोड़ें।
- जब जियोफेंस जोड़े जाते हैं, तो हम LocationClient से डिस्कनेक्ट कर देते हैं और हम सेवा बंद कर देते हैं।
- इसके अलावा, सभी आशाएं लंबित सूची के लिए है , जो एक क्षेत्र में प्रवेश करने या छोड़ने पर इंटेंट सर्विस शुरू करेगी । सेवा स्टेटस बार में सूचनाएं जोड़ती है और काम किए गए भू-खंडों को हटाने के लिए एक सेवा बनाती है।
- बनाई गई सेवा स्थान को फिर से क्लिक करती है।
- जब LocationClient को प्रारंभ किया जाता है, तो हम खर्च किए गए भू-खंडों को हटा देते हैं।
- जब जियोफेंस हटा दिए जाते हैं, तो LocationClient से डिस्कनेक्ट करें और सेवा बंद कर दें।
- लाभ!
जैसा कि हम देखते हैं, मुख्य चरित्र
LocationClient है । वह भू-स्थान के साथ एपीआई का पता लगाने और काम करने के लिए जिम्मेदार है।
व्यापार करने के लिए!
सबसे पहले आपको Google Play सेवाओं को कनेक्ट करना होगा। यह कैसे किया जाता है
यहां वर्णित
है ।
आगे, गतिविधि में, हम प्रदर्शन तत्वों को इनिशियलाइज़ करते हैं। इस क्षेत्र से, बटन क्लिक करते समय हम एक सेवा को कॉल करने में रुचि रखते हैं:
int transitionType = Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT; MyGeofence myGeofence = new MyGeofence(mId, latitude, longitude, radius, transitionType); Intent geofencingService = new Intent(activity, GeofencingService.class); geofencingService.putExtra(GeofencingService.EXTRA_ACTION, GeofencingService.Action.ADD); geofencingService.putExtra(GeofencingService.EXTRA_GEOFENCE, myGeofence); activity.startService(geofencingService);
यहां हम अपनी सेवा (
जियोफेंसिंग सर्विस ) के लिए एक
इरादा बनाते हैं और इसके लिए आवश्यक डेटा स्थानांतरित करते हैं। चूंकि
जियोफेंसिंग सेवा जियोफेंस को जोड़ने और हटाने के लिए जिम्मेदार है (उदाहरण में मैंने इन कार्यों को अलग-अलग सेवाओं में अलग नहीं करने का फैसला किया है), हमें उस प्रकार के ऑपरेशन को स्थानांतरित करना होगा जिसे सेवा द्वारा निष्पादित किया जाना चाहिए। इस स्थिति में, यह ऐड-ऑन (
जिओफेंसिंग सर्विस (
ए.आई.एस.डीडी ))। सेवा को जियोफेंस डेटा भी चाहिए। हम उन्हें MyGeofence वर्ग के एक ऑब्जेक्ट के रूप में पास करते हैं, जो अनिवार्य रूप से
Geofence.Builder (हम बाद में इसके बारे में बात करेंगे) पर एक आवरण है।
तो, हम केंद्र के निर्देशांक और क्षेत्र के त्रिज्या, साथ ही साथ आंदोलन के प्रकार को प्रसारित करते हैं। बाद के तीन प्रकार के हो सकते हैं: GEOFENCE_TRANSITION_ENTER, GEOFENCE_TRANSITION_EXIT और GEOFENCE_TRANSITION_DWELL। यदि पहले दो के साथ सब कुछ स्पष्ट है, तो तीसरे के लिए स्पष्टीकरण की आवश्यकता है। GEOFENCE_TRANSITION_DWELL इंगित करता है कि उपयोगकर्ता ने क्षेत्र में प्रवेश किया है और इसमें कुछ समय बिताया है। इस सिग्नल का उपयोग करने के लिए, आपको
भू-आकृति का निर्माण करते समय
setLiteringDelay को सेट करना होगा। इस उदाहरण में, GEOFENCE_TRANSITION_DWELL का उपयोग नहीं किया गया है।
चलो सेवा पर चलते हैं। सेवा
GooglePlayServicesClient.ConnectionCallbacks ,
GooglePlayServicesClient.OnConnectionFailedListener ,
LocationClient.OnAddGeofencesResultListener ,
LocationClient.OnRemoveGeofencesResultListener इंटरफ़ेस को लागू करती है। यह उसे
LocationClient के साथ काम करने के लिए पूरी तरह जिम्मेदार होने की अनुमति देता है।
OnStartCommand में हमें ऑपरेशन (ADD या
REMOVE) का प्रकार मिलता है और इस क्रिया को करने के लिए आवश्यक डेटा खींचता है। उसके बाद, आरंभ करें और
LocationClient चलाएँ:
mAction = (Action) intent.getSerializableExtra(EXTRA_ACTION); switch (mAction) { case ADD: MyGeofence newGeofence = (MyGeofence) intent.getSerializableExtra(EXTRA_GEOFENCE); mGeofenceListsToAdd.add(newGeofence.toGeofence()); break; case REMOVE: mGeofenceListsToRemove = Arrays.asList(intent.getStringArrayExtra(EXTRA_REQUEST_IDS)); break; } mLocationClient = new LocationClient(this, this, this); mLocationClient.connect();
MGeofenceListsToAdd geofence को जोड़ने से पहले, हमने
MyGeofence वर्ग
ऑब्जेक्ट के
toGeofence () विधि को
कॉल किया । मैंने पहले ही कहा है कि
MyGeofence Geofence.Builder पर एक आवरण है:
public MyGeofence(int id, double latitude, double longitude, float radius, int transitionType) { this.id = id; this.latitude = latitude; this.longitude = longitude; this.radius = radius; this.transitionType = transitionType; } public Geofence toGeofence() { return new Geofence.Builder() .setRequestId(String.valueOf(id)) .setTransitionTypes(transitionType) .setCircularRegion(latitude, longitude, radius) .setExpirationDuration(ONE_MINUTE) .build(); }
Geofence.Builder Geofence बनाने के लिए एक उपयोगिता वर्ग है। हम आवश्यक पैरामीटर सेट करते हैं, और फिर ऑब्जेक्ट बनाने के लिए
बिल्ड () विधि को कॉल करते हैं। ऊपर आवश्यक न्यूनतम पैरामीटर है। यहां यह
setExpirationDuration पर ध्यान देने
योग्य है । तथ्य यह है कि पंजीकृत जियोफेंस को केवल दो मामलों में हटाया जा सकता है: एक निर्दिष्ट समय के बाद या एक स्पष्ट विलोपन के साथ। इसलिए, यदि आप एक पैरामीटर के रूप में NEVER_EXPIRE पास करते हैं, तो आपको ऑब्जेक्ट को स्वयं हटाने का ध्यान रखना चाहिए।
स्थान API के लिए सीमाएँ
हैं : एक बार में अधिकतम 100 जियोफ़ोन प्रति अनुप्रयोग।
LocationClient कनेक्ट होने के बाद,
GooglePlayServicesClient.ConnectionCallbacks इंटरफ़ेस कॉलबैक, कनेक्ट किए गए कार्य
करेगा । इसमें, हम वर्तमान प्रकार की क्रिया के आधार पर जोड़ते या हटाते हैं:
@Override public void onConnected(Bundle bundle) { Log.d("GEO", "Location client connected"); switch (mAction) { case ADD: Log.d("GEO", "Location client adds geofence"); mLocationClient.addGeofences(mGeofenceListsToAdd, getPendingIntent(), this); break; case REMOVE: Log.d("GEO", "Location client removes geofence"); mLocationClient.removeGeofences(mGeofenceListsToRemove, this); break; } }
जैसा कि हम देख सकते हैं,
AddGeofences में से एक पैरामीटर के लिए एक
PendingIntent की आवश्यकता होती है, जो चलते समय काम करेगा। हमारे मामले में,
PendingIntent IntentService शुरू करेगा:
private PendingIntent getPendingIntent() { Intent transitionService = new Intent(this, ReceiveTransitionsIntentService.class); return PendingIntent.getService(this, 0, transitionService, PendingIntent.FLAG_UPDATE_CURRENT); }
कार्रवाई पूरी होने के बाद,
OnAddGeofencesResultListener या
OnRemoveGeofencesByRequestIdsResult शुरू हो जाता है , जिसमें हम
LocationClient से डिस्कनेक्ट करते हैं और सेवा बंद कर देते हैं:
@Override public void onAddGeofencesResult(int i, String[] strings) { if (LocationStatusCodes.SUCCESS == i) { Log.d("GEO", "Geofences added " + strings); for (String geofenceId : strings) Toast.makeText(this, "Geofences added: " + geofenceId, Toast.LENGTH_SHORT).show(); mLocationClient.disconnect(); stopSelf(); } else { Log.e("GEO", "Error while adding geofence: " + strings); } } @Override public void onRemoveGeofencesByRequestIdsResult(int i, String[] strings) { if (LocationStatusCodes.SUCCESS == i) { Log.d("GEO", "Geofences removed" + strings); mLocationClient.disconnect(); stopSelf(); } else { Log.e("GEO", "Error while removing geofence: " + strings); } }
एप्लिकेशन का अंतिम भाग
IntentService है , जो तब शुरू होता है जब डिवाइस उपयोगकर्ता
जियोफेंस सीमा पार करता है। सभी क्रियाएं
onHandleIntent में की
जाती हैं :
@Override protected void onHandleIntent(Intent intent) { if (LocationClient.hasError(intent)) { Log.e(TRANSITION_INTENT_SERVICE, "Location Services error: " + LocationClient.getErrorCode(intent)); return; } int transitionType = LocationClient.getGeofenceTransition(intent); List<Geofence> triggeredGeofences = LocationClient.getTriggeringGeofences(intent); List<String> triggeredIds = new ArrayList<String>(); for (Geofence geofence : triggeredGeofences) { Log.d("GEO", "onHandle:" + geofence.getRequestId()); processGeofence(geofence, transitionType); triggeredIds.add(geofence.getRequestId()); } if (transitionType == Geofence.GEOFENCE_TRANSITION_EXIT) removeGeofences(triggeredIds); }
यहां, हम मुख्य रूप से
LocationClient के स्थिर तरीकों का उपयोग करते हैं। सबसे पहले, हम
hasrrror का उपयोग करके त्रुटियों की जाँच करते हैं। तब हमें क्रमशः
GoGeofenceTransition और
getTriggeringGeofences का उपयोग करके गति के प्रकार और ट्रिगर किए गए
जियोफ़ोन की सूची
मिलती है। हम प्रत्येक भू-आकृति के प्रसंस्करण को कहते हैं और इसकी आईडी को बचाते हैं। और अंत में, हम जियोफेंस को हटा देते हैं यदि यह आंदोलन जियोफेंस से बाहर निकलता है।
जियोफेंस को हटाने के लिए, हम फिर से एक सर्विस बनाते हैं, जिसमें हम ऑपरेशन टाइप (REMOVE) और डिलीट के लिए आईडी लिस्ट ट्रांसफर करते हैं:
private void removeGeofences(List<String> requestIds) { Intent intent = new Intent(getApplicationContext(), GeofencingService.class); String[] ids = new String[0]; intent.putExtra(GeofencingService.EXTRA_REQUEST_IDS, requestIds.toArray(ids)); intent.putExtra(GeofencingService.EXTRA_ACTION, GeofencingService.Action.REMOVE); startService(intent); }
वह सब है!
मुझे उम्मीद है कि उदाहरण स्पष्ट और दिलचस्प है। मैं आपको सभी अच्छे अनुप्रयोगों की कामना करता हूं!
अद्यतन:लेख और कोड 2 वर्ष में बहुत पुराने हो गए हैं।
रिपॉजिटरी में कोड अपडेट करने के लिए
विलकमैन को धन्यवाद।
उनके
लेख में अद्यतन स्थान एपीआई के साथ काम करने के बारे में और पढ़ें
।