2012-03-22 61 views
3

我需要使用adndroid接收gps定位,但我不希望设备在活动代码中显式注册LocationListener,或者等等...即我想直接在Manifest文件中注册LocationListener。Android:如何在清单中注册一个被动的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) {} 
} 

但无论我做什么,我不geht模拟器抓新的(模拟)的位置我通过DDMS推... :(

有谁知道如何得到这个工作?

回答

1

位置管理器不会广播位置更新。您必须以编程方式请求位置更新。

除了清单中的接收者声明是BroadcastReceiver,您的LocationListener不是BroadcastReceiver。这意味着如果有人发送了与你的过滤器匹配的braodcast,当类加载器试图实例化BroadcastReceiver时,你会得到一个类型不匹配。

+0

所以没有办法有某种“睡眠”不经常在后台左右运行,但是有一些功能被触发每次接收位置锁定时间的应用? – xenonite 2012-03-22 14:10:43

+0

您可能会考虑使用后台服务,后台服务会请求位置更新,然后以一些有用的方式对其进行反应。没有必要为此开放活动。但是,当用户不通过设置WakeLock与设备进行交互时,请确保设备的CPU没有关闭。 – Stefan 2012-03-22 14:20:43

+0

这完全是我不想做的!我想听我自己没有要求的位置更新。更确切地说:每次用户(或其他应用程序)激活gps并请求定位,我希望我的应用程序变得活跃并以某种方式对此做出反应。在其他时候,希望我的应用程序保持被动 - 或更好:完全不活动。所以:唤醒锁不是一个选项。一个后台服务可能会做的伎俩,但这将需要*一些*努力保持它运行等等等等等等等等等等。 – xenonite 2012-03-22 14:30:35

2

看一看Deep Dive into Location。 Reto Meier解释了如何通过PendingIntent将服务注册为被动LocationUpdate的接收者。

重要的部分是不使用接收侦听器对象但使用接收PendingIntentmethods的requestLocation更新方法。这样,即使所有活动都在收到gps修复或网络位置时完成,PendingIntent也会被解雇并启动您的服务。
Reto Meier使用广播接收器进行android.intent.action.BOOT_COMPLETED检查应用程序是否应在后台执行位置更新,然后使用PendingIntent请求位置更新。

+0

也许我不能正确理解被动位置提供者的原则。我希望这会让我有一个方法来注册一个被动位置提供程序,然后被动地等待,直到其他应用程序检索位置更新...现在我试图这样做:我有一个远程服务,它再次注册一个被动位置监听器。不幸的是,onLocationChanged从来没有被调用:( – xenonite 2012-03-29 14:22:58

+0

阅读在我的文章中链接的博客文章,所有内容都在这里解释。注册监听器对象的问题是,您的应用需要保持活动状态才能使监听器工作。服务在监听器注册后自动终止,然后监听器被java垃圾收集声明。如果你注册了一个待处理的Intent,位置管理器将在新的位置可用时开始你的服务。 – Janusz 2012-03-29 14:28:15

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” 的接收器。

相关问题