Android: Как зарегистрировать пассивный LocationListener в манифесте? - PullRequest
3 голосов
/ 22 марта 2012

Мне нужно получать исправления положения GPS с помощью adndroid, но я не хочу, чтобы устройство явно регистрировало LocationListener в коде Activity или около того ... т.е. я хочу зарегистрировать 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 ...: (

Кто-нибудь знает, как заставить это работать?

Ответы [ 4 ]

2 голосов
/ 29 марта 2012

Взгляните на Глубокое погружение в локацию . Reto Meier объясняет, как зарегистрировать сервис в качестве получателя пассивного LocationUpdate через PendingIntent.

Важная часть заключается в том, чтобы не использовать методы обновления requestLocation, которые принимают объект прослушивателя, а использовать методы , которые получают PendingIntent . Таким образом, даже если все ваши действия завершены в момент получения исправления GPS или определения местоположения в сети, PendingIntent запускается и запускает вашу службу.
Reto Meier использует Broadcast Receiver для android.intent.action.BOOT_COMPLETED, который проверяет, должно ли приложение выполнять обновления местоположения в фоновом режиме, а затем запрашивает обновления местоположения с помощью PendingIntent.

1 голос
/ 22 марта 2012

Менеджер местоположений не передает обновления местоположения.Вы должны запрашивать обновления местоположения программно.

Кроме того, декларация получателя в манифесте предназначена для BroadcastReceiver, ваш LocationListener не является BroadcastReceiver.Это означает, что если кто-то отправит braodcast, соответствующий вашему фильтру, вы получите несоответствие типов, когда загрузчик классов попытается создать экземпляр BroadcastReceiver.

0 голосов
/ 03 марта 2014

Если вы хотите использовать библиотеку, проверьте это. Он использует пассивный провайдер местоположения и предоставляет его для каждого широковещательного приемника. Очень прост в использовании.

Little-Fluffy-Location Library для Android

0 голосов
/ 29 октября 2013

Попробуйте зарегистрировать ожидающее намерение с помощью метода 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».

...