2011-12-29 15 views
6

जो मैं करने का प्रयास कर रहा हूं वह है कि एक सी 2 डीएम संदेश प्राप्त करते समय, एक सेवा शुरू करें जो 'x' समय के लिए स्थान मांगती है और फिर उस स्थान को हमारे सर्वर पर बंद कर देती है। सी 2 डीएम संदेश सेवा को सही ढंग से शुरू करता है, और जीपीएस स्थान चालू हो जाता है, लेकिन यह कभी अपडेट नहीं होता है। यह थ्रेड में निर्दिष्ट समय (वर्तमान में 12 सेकंड) के लिए बस बैठता है और कुछ भी नहीं करता है। मैं अपने ऐप में कहीं और सटीक कोड का उपयोग कर रहा हूं (सेवा के रूप में नहीं) और यह पूरी तरह से काम करता है। मैं क्या गलत कर रहा हूं?स्थान प्रारंभ करना सेवा एंड्रॉइड

यह c2dm संदेश प्राप्त करते समय सेवा शुरू करता है।

context.startService(new Intent(context, ServicePingLocation.class)); 

यह सेवा के लिए ही कोड है। जो भी कभी भी बुलाया जाता है, वह "ऑनक्रेट" और "ऑनस्टार्ट" होता है।

public class ServicePingLocation extends Service implements LocationListener { 

private final String DEBUG_TAG = "[GPS Ping]"; 
private boolean xmlSuccessful = false; 
private boolean locationTimeExpired = false; 

private LocationManager lm; 
private double latitude; 
private double longitude; 
private double accuracy; 

@Override 
public void onLocationChanged(Location location) { 
    Log.d(DEBUG_TAG, "onLocationChanged"); 

    latitude = location.getLatitude(); 
    longitude = location.getLongitude(); 

    accuracy = location.getAccuracy(); 
} 

@Override 
public void onProviderDisabled(String provider) { 
    Log.d(DEBUG_TAG, "onProviderDisabled"); 
    Toast.makeText(
      getApplicationContext(), 
      "Attempted to ping your location, and GPS was disabled.", 
      Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onProviderEnabled(String provider) { 
    Log.d(DEBUG_TAG, "onProviderEnabled"); 
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10f, this); 
} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    Log.d(DEBUG_TAG, "onStatusChanged"); 

} 

@Override 
public void onCreate() { 
    Log.d(DEBUG_TAG, "onCreate"); 
} 

@Override 
public void onDestroy() { 
    Log.d(DEBUG_TAG, "onDestroy"); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    Log.d(DEBUG_TAG, "onBind"); 

    return null; 
} 

@Override 
public void onStart(Intent intent, int startid) { 
    Log.d(DEBUG_TAG, "onStart"); 

    lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10f, this); 
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 
      300f, this); 

    Log.d(DEBUG_TAG, lm.toString()); 

    new SubmitLocationTask(ServicePingLocation.this).execute(); 
} 

private void locationTimer() { 

    new Handler().postDelayed(new Runnable() { 
     // @Override 
     @Override 
     public void run() { 
      locationTimeExpired = true; 
     } 
    }, 12000); 
} 

private class SubmitLocationTask extends AsyncTask<String, Void, Boolean> { 

    /** application context. */ 
    private Context context; 

    private Service service; 

    public SubmitLocationTask(Service service) { 
     this.service = service; 
     context = service; 
    } 

    @Override 
    protected void onPreExecute() { 
     locationTimer(); // Start 12 second timer 
    } 

    @Override 
    protected void onPostExecute(final Boolean success) { 

     if (success && xmlSuccessful) { 
      lm.removeUpdates(ServicePingLocation.this); 
      onDestroy(); 
     } else { 
      if (!GlobalsUtil.DEBUG_ERROR_MSG.equals("")) 
       Toast.makeText(getBaseContext(), 
         GlobalsUtil.DEBUG_ERROR_MSG, Toast.LENGTH_SHORT) 
         .show(); 
      GlobalsUtil.DEBUG_ERROR_MSG = ""; 
     } 
    } 

    @Override 
    protected Boolean doInBackground(final String... args) { 
     try { 

      DateFormat df = null; 
      df = new SimpleDateFormat("M/d/yy h:mm a"); 
      Date todaysDate = new Date();// get current date time with 
              // Date() 
      String currentDateTime = df.format(todaysDate); 

      while ((accuracy > 100f || accuracy == 0.0) 
        && !locationTimeExpired) { 
       // We just want it to sit here and wait. 
      } 

      return xmlSuccessful = SendToServerUtil.submitGPSPing(
        0, longitude, 
        latitude, accuracy, currentDateTime); 
     } catch (Exception e) { 

      return false; 
     } 
    } 
} 

}

[संपादित करें] मुद्दा मैं हो रही थी ठीक किया गया। कोड वास्तव में काम कर रहा था। मैंने नेटवर्क प्रदाता को जोड़ा, सेवा को रोकने के लिए ऑनस्ट्रोय() विधि को समायोजित किया, और जीपीएस सिग्नल को पकड़ने के लिए इस्तेमाल किए गए समय को ट्वीक किया।

सलाह के लिए धन्यवाद, CommonsWare

+1

12 सेकंड सभी परिस्थितियों में पर्याप्त नहीं हो सकता है। आप मेरे ['LocationPoller'] (https://github.com/commonsguy/cwac-locpoll) पर एक नज़र डाल सकते हैं, जो इस तरह के परिदृश्यों के लिए डिज़ाइन किया गया है। – CommonsWare

+0

हाय रयान, मैं वास्तव में कुछ इसी तरह काम कर रहा हूं और मुझे अपना कोड काम करने के लिए नहीं मिल रहा है। मैं इसे अपने कोड के साथ परीक्षण कर रहा हूं और यह संकलित नहीं करता है। आपके कोड में "xmlSUccessful" और "SendToServerUtil", "GlobalsUtil" श्रेणी क्या है? –

+0

xml असफल बूलियन है जिसका उपयोग मैंने सर्वर को स्थान भेजने के बाद आरईएसटी प्रतिक्रिया को संभालने के लिए किया था। SendToServerUtil, मेरे पास एक यूटिलिटीज फ़ाइल है, जिसमें मेरे सभी सर्वर संचार कॉल शामिल हैं (उदाहरण के लिए, "SendLocation")। GlobalsUtil केवल एक सामान्य उपयोगिता वर्ग है जिसे मैंने अपने सभी वैश्विक चरों को संग्रहीत किया है। वह अंतिम व्यक्ति शायद अच्छा अभ्यास नहीं है, लेकिन यह मेरे पहले असली ऐप्स में से एक था ... आप रहते हैं और आप सीखते हैं, है ना? किसी भी तरह से, आप उन सभी संदर्भों को हटा सकते हैं और आपको कोई समस्या नहीं होनी चाहिए। – RyanInBinary

उत्तर

0

मुद्दा मैं हो रही थी ठीक किया गया। कोड वास्तव में काम कर रहा था। मैंने नेटवर्क प्रदाता को जोड़ा, सेवा को रोकने के लिए ऑनस्ट्रोय() विधि को समायोजित किया, और जीपीएस सिग्नल को पकड़ने के लिए इस्तेमाल किए गए समय को ट्वीक किया।

सलाह के लिए धन्यवाद, कॉमन्सवेयर

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