我正在尝试使用Android的LocationManager requestLocationUpdates。一切正常,直到我尝试提取广播接收器中的实际位置对象。我是否需要专门为我的自定义意图定义“附加内容”,以便在我将其传递给requestLocationUpdates之前安装Android LocationManager,以便它知道如何将其添加到intent中,或者它是否会创建附加组件,无论它何时通过触发意图是广播接收器?
我的代码如下所示:
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);
我有一个广告接收器,在宣言中定义为:
<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();
}
}
我的“loc”对象即将出现。
答案 0 :(得分:20)
好的,我设法通过将广播接收器代码中的KEY_LOCATION_CHANGED更改为:
来解决此问题。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();
}
}
答案 1 :(得分:14)
我试图对您提出的解决方案进行编码和测试,因为我面临着与接近警报和携带位置对象的意图类似的问题。根据您提供的信息,您设法克服了BroadcastReceiver方面的空对象检索。您可能没有注意到的是,现在您应该收到与您的意图首次创建时相同的位置(也被视为:意图缓存问题)。
为了克服这个问题,我使用了FLAG_CANCEL_CURRENT,这是很多人提出的,它工作得非常好,可以获取新的(和多汁的:P)位置值。因此,定义待处理意图的行应如下所示:
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
但是,如果符合以下条件,则可以忽略此项: