2012-03-22 48 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」 的接收器。

相關問題