我需要使用adndroid接收gps位置修复,但我不希望设备在Activity代码中显式注册LocationListener ...即我想直接在Manifest文件中注册LocationListener。
不幸的是,这不起作用:(这是我的代码:
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<receiver android:name=".GPSLocationListener" android:enabled="true">
<intent-filter>
<action android:name="android.location.LocationManager.KEY_LOCATION_CHANGED" />
</intent-filter>
</receiver>
而我的听众看起来像这样:
public class GPSLocationListener implements LocationListener
{
public void onLocationChanged(Location location)
{
Log.d(Config.LOGTAG, "GPSLocationListener.java: GPS LOCATION UPDATE CAUGHT");
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
}
但无论我做什么,我都不会让模拟器抓住我通过DDMS推送的新(模拟)位置...... :(
有谁知道如何让这个工作?
答案 0 :(得分:2)
看看Deep Dive into Location。 Reto Meier解释了如何通过PendingIntent将服务注册为被动LocationUpdate的接收者。
重要的一点是不要使用带有侦听器对象的requestLocation更新方法,而是使用接收methods的PendingIntent。这样,即使您收到gps修复或网络位置的所有活动都已完成,PendingIntent也会被触发并启动您的服务。
Reto Meier使用广播接收器for android.intent.action.BOOT_COMPLETED检查应用程序是否应在后台进行位置更新,然后使用PendingIntent请求位置更新。
答案 1 :(得分:1)
位置管理员不会广播位置更新。您必须以编程方式请求位置更新。
除了清单中的收件人声明是BroadcastReceiver
之外,您的LocationListener
不是BroadcastReceiver
。这意味着如果有人发送了与您的过滤器匹配的braodcast,当类加载器尝试实例化BroadcastReceiver
时,您会遇到类型不匹配。
答案 2 :(得分:0)
尝试使用LocationManager.requestLocationUpdates()方法注册待处理的意图:
LocationManager mgr = (LocationManager) getSystemService(LOCATION_SERVICE);
Intent intent = new Intent("Unique_Broadcast_Message");
PendingIntent launchIntent = PendingIntent.getBroadcast(your activity, 0, intent, 0);
mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, launchIntent);
另外,声明接收“Unique_Broadcast_Message”的接收器。
答案 3 :(得分:0)
如果您想使用库,请检查一下。它使用被动位置提供程序,并按广播接收器提供。非常容易使用。