2010-01-02 8 views
20

मैं Android के LocationManager requestLocationUpdates उपयोग करने के लिए कोशिश कर रहा हूँ। जब तक मैं अपने प्रसारण रिसीवर में वास्तविक स्थान ऑब्जेक्ट निकालने का प्रयास नहीं करता तब तक सब कुछ काम कर रहा है। क्या मुझे अपने कस्टम इरादे में विशेष रूप से "एक्स्ट्रा" को परिभाषित करने की आवश्यकता है ताकि एंड्रॉइड लोकेशन मैनेजर इसे अनुरोध करने से पहले पास कर सके। स्थान अपडेट करता है, इसलिए यह जानता है कि इसे इरादे में कैसे जोड़ा जाए, या जब यह निकाला जाता है तो यह अतिरिक्त-बंडल बनाएगा प्रसारण रिसीवर का इरादा?एंड्रॉयड: जब LocationManager.requestLocationUpdates का उपयोग कर कैसे आशय बंडल एक्स्ट्रा कलाकार से स्थान की जानकारी प्राप्त करने के लिए()

मेरे कोड इस तरह दिखता है:

<receiver android:name=".LocationReceiver"> 
    <intent-filter> 
     <action android:name="com.myapp.swarm.LOCATION_READY" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</receiver> 

और के रूप में प्रसारण रिसीवर वर्ग:

public class LocationReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    //Do this when the system sends the intent 
    Bundle b = intent.getExtras(); 
    Location loc = (Location)b.get("KEY_LOCATION_CHANGED"); 

    Toast.makeText(context, loc.toString(), Toast.LENGTH_SHORT).show(); 
    } 
} 

Intent intent = new Intent("com.myapp.swarm.LOCATION_READY"); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    0, intent, 0); 

//Register for broadcast intents 
int minTime = 5000; 
int minDistance = 0; 
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, 
    minDistance, pendingIntent); 

मैं एक प्रसारण रिसीवर के रूप में घोषणा पत्र में परिभाषित किया गया है है

मेरा "लोक" ऑब्जेक्ट शून्य हो रहा है।

public class LocationReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    //Do this when the system sends the intent 
    Bundle b = intent.getExtras(); 
    Location loc = (Location)b.get(android.location.LocationManager.KEY_LOCATION_CHANGED); 

    Toast.makeText(context, loc.toString(), Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

पूर्ण जांच को याद रखें - इन सभी उद्देश्यों में 'स्थान' ऑब्जेक्ट्स –

उत्तर

20

ठीक है, मैं करने के लिए प्रसारण रिसीवर कोड में KEY_LOCATION_CHANGED बदलकर इसे ठीक करने में कामयाब और स्थान वस्तुओं को ले जाने के इरादे। आपके द्वारा प्रदान की गई जानकारी के अनुसार, आप ब्रॉडकास्ट रिसीवर की तरफ, शून्य ऑब्जेक्ट पुनर्प्राप्ति को पार करने में कामयाब रहे। आपने जो देखा नहीं है वह यह है कि अब आपको वही स्थान प्राप्त होना चाहिए जैसा आपका इरादा पहले बनाया गया था (इसे भी देखा गया: इरादा कैशिंग समस्या)।

इस समस्या को दूर करने के लिए, मैंने FLAG_CANCEL_CURRENT का उपयोग किया, जैसा कि यहां कई लोगों द्वारा प्रस्तावित किया गया है और यह ताजा (और रसदार: पी) स्थान मान लाने के लिए बहुत बढ़िया काम करता है। तो लाइन अपने लंबित इरादे को परिभाषित करने के लिए इस तरह दिखना चाहिए:

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

हालांकि, अगर आप इस की उपेक्षा कर सकते हैं:

  • उद्देश्य एक स्थान मूल्य प्राप्त करने के लिए सिर्फ एक बार था
  • आप पर काबू पाने में कामयाब यह आपकी पोस्ट
14

मैं कोड करने की कोशिश की और परीक्षण किया है समाधान आप का प्रस्ताव रखा, के बाद से मैं निकटता अलर्ट के विषय में इसी तरह की समस्याओं का सामना करना पड़ रहा हूँ:

+0

मैन नहीं है, आपने मेरा दिन बचाया है। : डी – Davita

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