2010-08-22 14 views
8

इस तरह से मैं जीपीएस स्थान अपडेट के लिए सुन (LocationManager का उपयोग कर और एक LocationListener) है:एंड्रॉयड: LocationManager गतिशील minTime/minDistance समायोजित थ्रेसहोल्ड

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
listener = new MyLocationistener(); // LocationListener 
locationManager.requestLocationUpdates(
     LocationManager.GPS_PROVIDER, 
     30000, // milliseconds (minTime) 
     20, // meters (minDistance) 
     listener); 

लेकिन मैं गतिशील रूप से इस्तेमाल किया minTime और minDistance तर्क समायोजित करना चाहते हैं LocationManager#requestLocationUpdates द्वारा। मेरा उद्देश्य, बैटरी बचाने के लिए है कई उपयोग की नीतियों, यानी के अनुसार: उपयोगकर्ता चलती नहीं है

  • हैं, तो, minTime वृद्धि स्थान अपडेट
  • प्राप्त करने के लिए उपयोगकर्ता बहुत तेजी से आगे बढ़ रहा है, तो minDistance वृद्धि
  • उपयोगकर्ता घर के अंदर (कोई GPS कवरेज) है, तो दोनों
  • वृद्धि बैटरी बहुत कम है, तो दोनों
  • ... (किसी अन्य अनुमानी) को बढ़ाने के

मैं जानना चाहता हूं:

  1. क्या यह बैटरी जीवन को बचाने के लिए वास्तव में एक अच्छा विचार है?
  2. मैं इस तरह के समायोजन कैसे कर सकता हूं? यदि केवल एकमात्र विकल्प है, तो मैं LocationManager#removeUpdates और LocationManager#requestLocationUpdates दोनों को फिर से कॉल कर सकता हूं।
  3. इस तरह के अनुकूली एल्गोरिदम लागू करने के लिए आप जानते हैं कि कोई विचार या नमूना कोड?

संपादित करें: एप्लिकेशन एक ट्रैकिंग सिस्टम है जो यह जानने के लिए है कि लोग कहां हैं, किसी दिए गए शिकार के निकट व्यक्ति को कार्य सौंपने के लिए। असल में बैटरी शायद 8 घंटे तक चलती है, इसलिए मैं इसे बढ़ाना चाहता हूं।

+0

दिलचस्प सवाल हालांकि मैं ज्यादा मदद नहीं कर सकता। मुझे लगता है कि बैटरी बचाने के लिए एक अच्छा विचार है। और मैं यह कहूंगा कि आपके द्वारा सुझाए गए समाधान एकमात्र हैं लेकिन मैं स्थान एपीआई में कोई विशेषज्ञ नहीं हूं इसलिए मैं दूसरों को बोलने दूँगा। – Sephy

+0

[मैं अपने आवेदन में एक ही कोड का इस्तेमाल किया है, लेकिन यह रिटर्न किसी भी मान does'nt, अगर यू लोग के किसी भी मेरे साथ ... मदद कर सकता है सोच रहा था] [1] [1]: http: //stackoverflow.com/questions/9514980/android-getting-speed-with-gps –

+0

इस तरह से हटाएं और जोड़ें: https://stackoverflow.com/questions/5385094/change-mintime-for-gps-locationlistener- गतिशील रूप से – jp1017

उत्तर

4

AFAIK आपको removeUpdates और requestLocationUpdates फिर से कॉल करने की आवश्यकता है।

इसके अलावा, आप अगर फोन एक्सीलरोमीटर जैसे सब पर आगे बढ़ रहा है, यह देखने के लिए अन्य तरीकों पर गौर कर सकते हैं। इसके बारे में here और see this other question's answers

लेकिन आपको अधिक विचार देने के लिए, आपको समस्या को स्वयं प्रस्तुत करने की आवश्यकता है। जब तक आपको कोई समस्या न हो, तब तक जल्दी से ऑप्टिमाइज़ करने का प्रयास न करें। यदि आपको इसके बारे में विवरण पोस्ट करने की आवश्यकता है।

+0

धन्यवाद। यह एक आंतरिक अनुप्रयोग है, जहां उपयोगकर्ताओं के पास कुछ तकनीकी कौशल हैं, इसलिए वे नहीं जानते कि एक जीपीएस क्या है और उन्हें सेटिंग बदलने या जीपीए रेडियो को चालू करने के लिए मजबूर करना उपयोगिता की समस्या है। बैटरी अब 8-10 घंटे तक चल रही है, और हमें इसे कम से कम 12 घंटे तक बढ़ाने की जरूरत है। –

1

क्या यह बैटरी जीवन को बचाने के लिए वास्तव में एक अच्छा विचार है?

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

उपयोगकर्ता घर के अंदर (कोई GPS कवरेज) है, तो दोनों

वृद्धि आप, GPS समाधान नहीं मिलता है, तो कर सकते हैं रेडियो बंद कर देते हैं, और बाद में पुन मिनट की कुछ संख्या की कोशिश (या के आधार पर एक यूआई घटना या कुछ)। जीपीएस छोड़ने का कोई मतलब नहीं है अगर यह आपको कोई अच्छा काम नहीं कर रहा है।

बैटरी बहुत कम है, तो, दोनों

वृद्धि बैटरी बहुत कम है, तो जीपीएस बंद कर दें। या तो एक कम-पावर प्रदाता पर स्विच करें (एक खोजने के लिए Criteria का उपयोग करें) या स्थान डेटा के बिना जाएं। उपयोगकर्ता को वरीयता के माध्यम से "बहुत कम" तय करने दें।

+0

धन्यवाद। आपको लगता है कि जीपीएस रेडियो को चालू रखना बेहतर है (इसे बंद करने और फिर से स्विच करने से बेहतर)। सेकेंड, मिनट? मेरा मतलब है, शायद अगर मुझे हर 30 सेकंड में एक फिक्स की ज़रूरत है, तो इसे जारी रखना बेहतर है, लेकिन अगर आपको हर 5 मिनट में फिक्स की ज़रूरत है तो यह सच नहीं होगा। –

+1

आप प्रोग्रामिंग पर जीपीएस स्विच नहीं कर सकते हैं, आपके उपयोगकर्ता को इसे आपके लिए स्विच करने की आवश्यकता है। आप उन्हें सेटिंग स्क्रीन पेश कर सकते हैं। – Pentium10

+0

यह जानने के लिए कि आपको कितनी बार डेटा मतदान करने की आवश्यकता है, हमें और विवरण दें। जैसे कि आप स्थान डेटा का उपयोग कर रहे हैं? – Pentium10

1

मैं कुछ इस तरह किया है:

मैं एक LocationService था (Service प्रदान करता है और LocationListener लागू करता है)। और मैं

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 1, 1, this); 

जोड़ा गया है और onLocationChangedListener में:

public void onLocationChanged(Location location) { 
     AlarmManager aleManager = (AlarmManager) LocationService.context.getSystemService(ALARM_SERVICE); 
//Change the values of MINIMIUM_TRIGGER_TIME and INTERVAL_TIME 
     Intent forceLoc = new Intent(LocationService.context, 
       ForceLocationService.class); 
     PendingIntent pendingForceLoc = PendingIntent.getService(
       LocationService.context, 0, forceLoc, 
       PendingIntent.FLAG_ONE_SHOT); 
     // CANCEL PREVIOUS alarm and set new one 
     aleManager.cancel(pendingForceLoc); 
     aleManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
       MINIMIUM_TRIGGER_TIME, INTERVAL_TIME, pendingForceLoc); 
    } 

और ForceLocationService में (IntentService फैली) को गति प्रदान इस तरह नियमित रूप से स्थान श्रोता:

locMan=(LocationManager)getSystemService(LOCATION_SERVICE); 
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, locationService); 

यह मैं करते हैं निम्नलिखित:

  1. से पहले alarmManager ForceLocationService से चलाता प्रणाली किसी भी स्थान अद्यतन हो जाता है तो वह स्वत: अद्यतन हो जाता है और अलार्म रीसेट करता है।

  2. यह अलार्म ट्रिगर तक अद्यतन नहीं मिलता है, तो यह अलार्म ट्रिगर करने के लिए मजबूर करता है, जिससे यह सुनिश्चित करना कि हम अद्यतन जब जरूरत मिलता है।

केवल मुद्दा मेरे पास है, यह अगर वहाँ स्थान में कोई बदलाव नहीं है कारण अलार्म की रीसेट onLocationChanged में किया जाता है() काम नहीं करता है।

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