2013-08-15 10 views
9

मुझे एक ऐप लिखने की ज़रूरत है, जो हर 5 मिनट मोबाइल फोन के वर्तमान स्थान (सभी मुफ़्त, उपलब्ध स्थान प्रदाताओं का उपयोग करके) निर्धारित करता है और इसे सर्वर पर भेजता है।एंड्रॉइड मोबाइल फोन के स्थान को लगातार कैसे ट्रैक करें?

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

ऐसा करने के लिए, मैंने निम्नलिखित कक्षा लागू की। मेरी गतिविधियों में से एक में, मैं इसका एक उदाहरण बनाता हूं और इसकी startTrackingUpdates विधि को कॉल करता हूं। locationChangeHandler स्थान डेटा की प्रसंस्करण करता है।

public class LocationTracker implements ILocationTracker, LocationListener { 
    public static final long MIN_TIME_BETWEEN_UPDATES = 1000 * 60 * 5; // 5 minutes 
    public static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters 
    private ILocationManager locationManager; 
    private ILocationChangeHandler locationChangeHandler; 

    public LocationTracker(final ILocationManager aLocationManager, 
      final ILocationChangeHandler aLocationChangeHandler) { 
     this.locationManager = aLocationManager; 
     this.locationChangeHandler = aLocationChangeHandler; 
    } 

    public void startTrackingUpdates() { 
     final List<String> providers = locationManager.getAllProviders(); 

     for (final String curProviderName : providers) 
     { 
      final ILocationProvider provider = locationManager.getLocationProvider(curProviderName); 

      if (!provider.hasMonetaryCost()) 
      { 
       subscribeToLocationChanges(provider); 
      } 
     } 
    } 

    private void subscribeToLocationChanges(final ILocationProvider aProvider) { 
     locationManager.requestLocationUpdates(aProvider.getName(), MIN_TIME_BETWEEN_UPDATES, 
       (float)MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
    } 

    public void onLocationChanged(final Location aLocation) { 
     locationChangeHandler.processLocationChange(new LocationWrapper(aLocation)); 
    } 

    public void onProviderDisabled(final String aProvider) { 
    } 

    public void onProviderEnabled(final String aProvider) { 
    } 

    public void onStatusChanged(final String aProvider, final int aStatus, 
      final Bundle aExtras) { 
    } 
} 

मैंने एप्लिकेशन बनाया और इसे अपने मोबाइल फोन पर स्थापित किया। फिर, सुबह में मैंने अपना फोन लिया, काम पर चला गया, फिर घर वापस चला गया। घर पर मैंने एप्लिकेशन के एक दिन के लंबे काम के परिणामों की जांच की और डेटाबेस में केवल एक रिकॉर्ड पाया।

बशर्ते शेष सिस्टम (डेटाबेस में स्थान डेटा का संचरण, डेटाबेस में बचत) सही ढंग से काम करता है, मुझे स्थान ट्रैकिंग कोड में कुछ समस्या होनी चाहिए (onLocationChanged को तब भी नहीं जोड़ा गया जब तक कि मैंने अपना स्थान बदल दिया बहुत बार)।

स्थानीय कोड प्रदाताओं में से एक के अनुसार MIN_DISTANCE_CHANGE_FOR_UPDATES मीटर से अधिक समय तक फ़ोन का स्थान बदलकर onLocationChanged के लिए मेरे कोड के साथ क्या गलत है (मुझे इसे कैसे बदलना चाहिए)?

अद्यतन 1 (2013/08/18 13:59 एमएसके):

मैं msh सिफारिशों के अनुसार मेरी कोड बदल दिया है। मैं निम्नलिखित कोड का उपयोग कर टाइमर प्रारंभ:

public void startSavingGeoData() { 
    final IAlarmManager alarmManager = activity.getAlarmManager(); 
    final IPendingIntent pendingIntent = activity.createPendingResult(
      ALARM_ID, intentFactory.createEmptyIntent(), 0); 
    alarmManager.setRepeating(INTERVAL, pendingIntent); 
} 

activity में मैं टाइमर ईवेंट हैंडलर निम्नलिखित रख:

@Override 
protected void onActivityResult(final int aRequestCode, final int aResultCode, 
     final Intent aData) { 
    geoDataSender.processOnActivityResult(aRequestCode, aResultCode, 
      new IntentWrapper(aData)); 
} 

जब फोन चालू है, सब कुछ उम्मीद के रूप में काम करता है - onActivityResultINTERVAL में एक बार निष्पादित किया जाता है मिलीसेकेंड।

लेकिन जब मैं पावर बटन दबाता हूं (स्क्रीन अक्षम हो जाती है), onActivityResult बिल्कुल भी नहीं बुलाया जाता है। जब मैं फिर से पावर बटन दबाता हूं, onActivityResult को कई बार निष्पादित किया जाता है, क्योंकि INTERVAL उस समय से गुजर चुका है जब मैंने फ़ोन बंद कर दिया था। अगर मैंने फोन को 1 * INTERVAL मिलीसेकंड के लिए बंद कर दिया है, तो यह एक बार आग लग जाएगा। अगर मैंने फोन को 2 * INTERVAL मिलीसेकंड के लिए बंद कर दिया है, तो यह दो बार आग लग जाएगा।

नोट: "बंद करना" से मेरा मतलब है कि पावर बटन का एक छोटा सा प्रेस (फोन अभी भी "रहता है" और इनकमिंग एसएमएस पर प्रतिक्रिया करता है उदाहरण)।

मैं कैसे startSavingGeoData का कोड क्रम में विधि onActivityResult हर INTERVAL मिलीसेकेंड निष्पादित करने के लिए के लिए भले ही आपका फ़ोन सोता को संशोधित करना चाहिए?

अद्यतन 2 (2013/08/18 19:29 एमएसके): न तो alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 0, INTERVAL, pendingIntent), और न ही alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, INTERVAL, INTERVAL, pendingIntent) समस्या हल हो।

+0

अलार्म प्रकार _WAKEUP स्थिरांक में से एक होना चाहिए, उदाहरण के लिए RTC_WAKEUP – msh

+0

@msh अपडेट देखें 2. –

+0

http://stackoverflow.com/questions/4459058/alarm-manager-example पहले प्रयास करें - यदि यह काम करता है, तो आधार पर यह। ध्यान दें कि जब तक आपको अधिक समय तक चलने की आवश्यकता होती है, तो यह केवल रिसीव रिटर्न तक wakelock रखता है - अपना खुद का – msh

उत्तर

8

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

+0

प्राप्त करें मैंने कोड बदल दिया ("अपडेट 1" देखें), लेकिन यह अभी भी अपेक्षित काम नहीं करता है। कोई विचार? –

+0

आप इस उदाहरण पर अपने अलार्म कोड का आधार बना सकते हैं http://stackoverflow.com/questions/4459058/alarm-manager-example – msh

+0

हां, वह उदाहरण काम करता है, फ़ोन को सोते समय भी स्थान प्राप्त करने के लिए कम से कम विधि निष्पादित की जाती है। –

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