2010-06-07 18 views
12

संपादित करें: मैं इस प्रश्न को फिर से लिख रहा हूं क्योंकि मैं स्पष्ट रूप से स्पष्ट नहीं था।एंड्रॉइड जीपीएस टाइमआउट

कभी-कभी एंड्रॉइड फोन पर जीपीएस सेवा को ठीक करने में काफी समय लगता है। कभी-कभी यह तेज़ होता है, कभी-कभी इसमें घंटों लगते हैं। मैं जानता हूं और इसे स्वीकार करता हूं।

मेरे पास एक ऐसा एप्लिकेशन है जो कई चीजें करता है। चीजों में से एक यह है कि उपयोगकर्ता को अपने मौजूदा निर्देशांक को सर्वर पर भेजने के लिए बटन पर क्लिक करने की अनुमति दें। मुझे फोन के निर्देशांक हैं, जब उपयोगकर्ता बटन पर क्लिक करता है या उसके बाद एक उचित समय के भीतर।

क्योंकि मुझे पता है कि एक जीपीएस फिक्स प्राप्त करना तत्काल नहीं है और मुझे पता है कि इसमें मिनट या घंटे लग सकते हैं (जिसके दौरान उपयोगकर्ता ने बहुत दूरी तय की है), मुझे इस सुविधा के लिए टाइमआउट कोड करना होगा। इस सुविधा के लिए, बटन पर क्लिक करने के बाद उपयोगकर्ता के जीपीएस स्थान को तीन मिनट (उदाहरण के लिए) अपलोड करना स्वीकार्य नहीं है। यह ठीक है अगर इसमें 45 सेकंड लगते हैं, तो ठीक नहीं है अगर इसमें 75 सेकंड लगते हैं। यदि सुविधा पर्याप्त तेज़ी से स्थान प्राप्त करने में विफल रही तो उपयोगकर्ता को एक त्रुटि अधिसूचना देना ठीक है।

मुझे जीपीएस स्थान प्राप्त करने और इसे सर्वर पर भेजने के लिए एक सुविधा की आवश्यकता है, जब तक कि इसमें एक से अधिक मिनट 'नहीं लगे।

मेरा मूल कोड नीचे है। मैंने इसे पोस्ट करने के बाद कुछ चीजें बदल दी हैं। मैंने ऑनस्टार्ट कमांड() विधि में एक टाइमर जोड़ा है। मैं टाइमरटास्क शुरू करता हूं कि 60 सेकंड के बाद मेरी स्टॉप() विधि को कॉल करेगा। ऑनलाक्शन चेंज() विधि की शुरुआत में, मैं टाइमरटास्क रद्द करता हूं।

मेरा सवाल है: क्या टाइमर योजना इस टाइमआउट को लागू करने का एक अच्छा तरीका है? क्या कोई बेहतर तरीका है?

मूल प्रश्न:

मैं एक Android एप्लिकेशन है, अन्य बातों के अलावा, एक सर्वर के लिए वर्तमान जीपीएस निर्देशांक भेजने के लिए जब उपयोगकर्ता इसे करने के लिए कहता है की जरूरत है लिख रहा हूँ। एक संदर्भ मेनू से, मैं नीचे सेवा चलाता हूं। सेवा एक स्थानसूची है और LocationManager से अपडेट का अनुरोध करता है। जब इसे स्थान मिलता है (ऑनलाक्शन चेंज()), यह स्वयं को श्रोता के रूप में हटा देता है और समन्वयक को सर्वर पर भेजता है। यह सब काम कर रहा है।

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

मुझे सेवा पर एक टाइमआउट चाहिए। क्या ऐसा करने का कोई अच्छा तरीका है? मैं धागे के साथ बहुत अनुभवी नहीं हूँ। मुझे लगता है कि मैं ऑनस्टार्ट कमांड() विधि में एक रननेबल चला सकता हूं जो किसी भी तरह 30 सेकंड नीचे गिना जाएगा और फिर, यदि कोई जीपीएस परिणाम नहीं है, तो मेरी सेवा की रोक() विधि को कॉल करें। क्या यह ऐसा करने का सबसे अच्छा तरीका है?

वैकल्पिक रूप से, क्या यह बताना संभव है कि जीपीएस ठीक नहीं हो सकता है? मुझसे यह कैसे होगा?

संपादित करें: आगे स्पष्टीकरण के लिए, मैं कुछ समय के बाद स्थान प्राप्त करने के लिए "छोड़ने" का सबसे अच्छा तरीका ढूंढ रहा हूं।

public class AddCurrentLocation extends Service implements LocationListener { 

    Application app; 
    LocationManager mLocManager; 
    ProgressDialog mDialog; 

    @Override 
    public int onStartCommand(Intent intent, int arg0, int arg1) { 
     app = getApplication(); 

     // show progress dialog 
     if (app.getScreen() != null) { 
      mDialog = ProgressDialog.show(app.getScreen(), "", "Adding Location. Please wait...", true); 
     } 

     // find GPS service and start listening 
     Criteria criteria = new Criteria(); 
     criteria.setAccuracy(Criteria.ACCURACY_FINE); 
     mLocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     String bestProvider = mLocManager.getBestProvider(criteria, true); 
     mLocManager.requestLocationUpdates(bestProvider, 2000, 0, this); 

     return START_NOT_STICKY; 
    } 

    private void stop() { 
     mLocManager.removeUpdates(this); 
     if (mDialog != null) { 
      mDialog.dismiss(); 
     } 
     stopSelf(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     // done with GPS stop listening 
     mLocManager.removeUpdates(this); 

     sendLocation(location); // method to send info to server 
     stop(); 
    } 

    // other required methods and sendLocation() ... 

} 
+0

तो इस समाधान को हल करने के बाद आप क्या करते थे? मेरी भी यही समस्या है। – sexitrainer

उत्तर

6

यह वास्तव में यह कैसे काम करता है। जीपीएस फिक्स पाने के लिए यह ज्यादातर स्थितियों में लगातार लंबे समय तक ले जाएगा।लेकिन प्रत्येक बिंदु पर उस बिंदु से (आपके कोड में हर 2 सेकंड) व्यक्ति की वर्तमान स्थिति होगी। और आपको प्राप्त पहला फिक्स व्यक्ति की वर्तमान स्थिति होगी, इसलिए डेटा "पुराना नहीं" होगा।

एक और बात। यदि आप किसी सेवा में यह कोड चला रहे हैं तो आपको यूआई को प्रगति संवाद के साथ अवरुद्ध नहीं करना चाहिए और निश्चित रूप से सेवा से नहीं। यह एक स्मृति रिसाव होने का इंतजार कर रहा है। आपको केवल प्रगति दिखाना चाहिए यदि यह ऐसा कुछ है जो सबसे अधिक 5 सेकंड ले सकता है और गतिविधि में थ्रेड में चल रहा है। एक अन्य विकल्प शीर्षक पट्टी में प्रगति संवाद दिखाने के लिए है, और फिर भी उपयोगकर्ता को ऐप से बातचीत करने दें (यही कारण है कि आप किसी भी सेवा का उपयोग करते हैं)। लंबे समय तक प्रगति दिखा रहा है वास्तव में उपयोगकर्ता मित्रतापूर्ण नहीं है। विशेष रूप से यदि वे किसी भी तरह अभिविन्यास (शायद दुर्घटना पर) बदलते हैं और फिर आपका ऐप संवाद के लिए सेवा संभाल के कारण दुर्घटनाग्रस्त हो जाता है और उन्हें शुरू करना होता है।

Google I/O 2010 app पर एक नज़र डालें ताकि एक सेवा के साथ गतिविधि को कैसे काम करना चाहिए। यह डेटा वापस खींचने के लिए एक सेवा का उपयोग करता है, और सेवा कुछ काम कर रही है, जबकि शीर्षक में प्रगति दिखाता है। और फिर भी आप ऐप में अन्य चीजें करने देते हैं।

+1

आपकी मदद के लिए धन्यवाद। जब मुझे कोई संदर्भ मेनू विकल्प चुनता है तो मुझे एक स्थान प्राप्त करने की आवश्यकता होती है। इसलिए यदि एक जीपीएस फिक्स प्राप्त करने में 15 मिनट लगते हैं (और यह कभी-कभी मेरे फोन पर होता है), तो वह स्थिति पुरानी हो जाएगी। असल में, मैं जानना चाहता हूं कि जब उपयोगकर्ता बटन पर क्लिक करता था और यदि यह बहुत लंबा लगता है (जो भी हो सकता है), तो मुझे उपयोगकर्ता को यह बताना होगा कि फ़ंक्शन विफल हो गया है। ज्यादातर मामलों में उपयोगकर्ता यह देखने के लिए फोन देख रहा होगा कि यह काम करता है या नहीं। मैं बस उन्हें जीपीएस सिग्नल के साथ घंटों तक वहां नहीं बैठ सकता :) –

+0

यदि ऐसा है तो ऐप शुरू होने पर आप जीपीएस शुरू क्यों नहीं करते हैं और फिर जब भी वे बटन दबाते हैं तो यह संभवतः पहले से ही एक फिक्स होगा । और जैसा कि मैंने पहले कहा था। जीपीएस के साथ स्थान पुराना नहीं होने वाला है। यह ठीक हो जाता है और स्थान अपडेट फोन का वर्तमान स्थान होगा। –

+0

मैंने अपना प्रश्न अधिक स्पष्ट होने के लिए संपादित किया है। –

4

स्कॉट, ऐसे कई कारक हैं जो इस बात को प्रभावित करते हैं कि पहला फिक्स कितना समय ले सकता है - या यहां तक ​​कि एक फिक्स भी हासिल किया जा सकता है, डिवाइस और उपग्रहों (जैसे इमारतों, घाटी की दीवारों, आदि) के बीच शारीरिक बाधाओं में सबसे आम है। ।

आप नियंत्रित नहीं कर सकते कि कब तक यह एक ठीक वितरित करने के लिए जीपीएस इंजन के लिए लेता है, लेकिन आपको बता सकता है इसकी कैसे कर पहले ठीक करने के समय सहित:

locationManager.addGpsStatusListener(gpsListener); 

    // this reports on the status of the GPS engine, but does not enable additional controls 
    private static final GpsStatus.Listener gpsListener = new GpsStatus.Listener() { 
     public void onGpsStatusChanged(int event) { 
      GpsStatus gpsStatus = locationManager.getGpsStatus(null); 
      switch (event) { 
       case GpsStatus.GPS_EVENT_STARTED: 
        Log.i(TAG, "onGpsStatusChanged(): GPS started"); 
        break; 
       case GpsStatus.GPS_EVENT_FIRST_FIX: 
        Log.i(TAG, "onGpsStatusChanged(): time to first fix in ms = " + gpsStatus.getTimeToFirstFix()); 
        break; 
       case GpsStatus.GPS_EVENT_SATELLITE_STATUS: 
        // int maxSatellites = gpsStatus.getMaxSatellites(); // appears fixed at 255 
        // if (H.DEBUG) Log.d(TAG, "onGpsStatusChanged(): max sats = " + maxSatellites); 
        if (H.VERBOSE) Log.d(TAG, "onGpsStatusChanged(): ##,used,s/n,az,el"); 
        Iterable<GpsSatellite>satellites = gpsStatus.getSatellites(); 
        Iterator<GpsSatellite>satI = satellites.iterator(); 
        while (satI.hasNext()) { 
         GpsSatellite satellite = satI.next(); 
         if (H.VERBOSE) Log.d(TAG, "onGpsStatusChanged(): " + satellite.getPrn() + "," + satellite.usedInFix() + "," + satellite.getSnr() + "," + satellite.getAzimuth() + "," + satellite.getElevation()); 
         // http://en.wikipedia.org/wiki/Global_Positioning_System: the almanac consists of coarse orbit and status information for each satellite 
         // http://en.wikipedia.org/wiki/Ephemeris: the positions of astronomical objects in the sky at a given time 
         // + "," + satellite.hasAlmanac() + "," + satellite.hasEphemeris()); 
        } 
        break; 
       case GpsStatus.GPS_EVENT_STOPPED: 
        Log.i(TAG, "onGpsStatusChanged(): GPS stopped"); 
        break; 
      }  
     } 
    }; 

घटनाक्रम इंजन के रूप में जनरेट किया जाएगा उपलब्ध उपग्रहों को सुनने का प्रयास करता है। हल्के बाधाओं के साथ हाल के एक परीक्षण पर मैंने पाया कि प्रारंभिक फिक्स प्राप्त करने में 22.4 सेकंड लग गए, जिसके दौरान 24 SATELLITE_STATUS घटनाओं को ठीक करने के लिए पर्याप्त साफ सिग्नल प्राप्त होने से पहले 8 उपग्रहों की क्रमिक पहुंच की रिपोर्टिंग की गई। यहां अंतिम घटना दी गई है:

06-08 23: 23: 25.147, डी, जीपीएस, 22427, "ऑन जीपीएसस्टैटस चेंज(): ##, प्रयुक्त, एस/एन, एजी, एल" 06-08 23:23 : 25.147, डी, जीपीएस, 22427, "onGpsStatusChanged(): 2, सत्य, 26.0,57.0,73.0" 06-08 23: 23: 25.147, डी, जीपीएस, 22427, "onGpsStatusChanged(): 4, true, 30.0 , 46.0,27.0 " 06-08 23: 23: 25.147, डी, जीपीएस, 22427," ऑन जीपीएसस्टैटस चेंज(): 5, सच, 1 9 .07144.0,25.0 " 06-08 23: 23: 25.155, डी, जीपीएस, 22427, "onGpsStatusChanged(): 9, सत्य, 22.0,202.0,22.0" 06-08 23: 23: 25.155, डी, जीपीएस, 22427, "onGpsStatusChanged(): 10, सत्य, 17.0,109.0,32.0" 06 -08 23: 23: 25.155, डी, जीपीएस, 22427, "onGpsStatusChanged(): 12, सत्य, 32.0,320.0,80.0" 06-08 23: 23: 25.155, डी, जीपीएस, 22427, "onGpsStatusChanged(): 2 9, सच, 21.0,278.0,21.0 " 06-08 23: 23: 25.155, डी, जीपीएस, 22427, "ऑन जीपीएसस्टैटस चेंज(): 30, सच, 31.0,312.0,43.0" 06-08 23: 23.163, डी, जीपीएसएलोकेशनप्रोवाइडर, 1039, टीटीएफएफ: 22457 06-08 23: 23: 25.194, मैं, जीपीएस, 22,427, onGpsStatusChanged(): एमएस में पहली ठीक करने के लिए समय = 22457

ध्यान दें कि ठीक समय में, आप वर्तमान स्थान हो रही होगी, न कि जहां आप एक बार हुआ हो सकता है। मुझे लगता है कि आपके पास पहले से ही आप वहां जा सकते हैं। या, यह जांचें कि पेशेवर here कैसे करते हैं।

+0

आपकी मदद के लिए धन्यवाद। मैंने अपना प्रश्न अधिक स्पष्ट होने के लिए संपादित किया है। –

+0

@ डीजेसी, कृपया टूटा लिंक को MyTracks.java पर सही करें। – Gili

+0

कोड में एच क्या है? – Siddhesh

-7

शॉन का जवाब के आधार पर, JSON में पैरामीटर पैक और JSON सर्वर

1

मैं ने वही समस्या के साथ संघर्ष कर दिया गया है और हाल ही में एक टाइमर से एक AlarmManager में स्विच करने में वस्तुओं भेज , जो बहुत अधिक मजबूत प्रतीत होता है। यह आपकी स्थिति के लिए अधिक हो सकता है (मैं इसे बार-बार स्थान नमूनाकरण के लिए उपयोग कर रहा हूं), लेकिन आप कम से कम टाइमर के बजाय Handler का उपयोग करना चाहेंगे। (Handler.postDelayed का उपयोग करें।)

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