установить 2 оповещения о близости с одной и той же трансляцией - PullRequest
3 голосов
/ 21 июля 2010

Я создаю оповещение о близости таким образом

    private void setProximityAlert(float radius, double lat, double lng, String place)
{
    long expiration = -1;
    LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Intent intent = new Intent(TREASURE_PROXIMITY_ALERT);
    intent.putExtra("lat", lat);
    intent.putExtra("lng", lng);
    intent.putExtra("place", place);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), -1, intent, 0);   
    locManager.addProximityAlert(lat, lng, radius, expiration, pendingIntent);
}

и по своей деятельности я зарегистрировал получателя таким образом

    IntentFilter intentFilter = new IntentFilter(TREASURE_PROXIMITY_ALERT);
    registerReceiver(new ProximityIntentReceiver(), intentFilter);
    setProximityAlert(10, 45.150344, 9.999815, "POINT1");

и мой приемник вещания правильно вызван. Итак, теперь я хочу добавить еще одно предупреждение о близости, возможно ли это? Я хочу, чтобы тот же приемник boadcast вызывался 2-мя оповещениями о близости. Я сделал это:

    IntentFilter intentFilter1 = new IntentFilter(TREASURE_PROXIMITY_ALERT1);
    registerReceiver(new ProximityIntentReceiver(), intentFilter1);        
    setProximityAlert(200f, 45.143848, 10.039741, "POINT2");

но это не работает, ничего не происходит. Я действительно сейчас нахожусь на этом, и мне было интересно, если это правильный путь. Мое намерение - триггерные оповещения: одно, когда GPS получает положение POINT1, а другое - в точке POINT2. Любая помощь приветствуется.

1 Ответ

6 голосов
/ 21 июля 2010

Вам нужно использовать любой уникальный setAction, чтобы система считала эти два намерения разными, иначе будет иметь тенденцию повторно использовать первое.

У меня есть этот код:

Intent intent = new Intent(this,PlacesProximityHandlerService.class);
intent.setAction("foo"+objPlace.getId());
intent.putExtra(Poi._ID, objPlace.getId());
intent.putExtra(Poi.LAT, objPlace.getLat());
intent.putExtra(Poi.LON, objPlace.getLon());
PendingIntent sender = PendingIntent.getService(this,0, intent, 0);
LocationUtils.addProximity(this, objPlace.getLat(),objPlace.getLon(), objPlace.getError(), -1,sender);

Также обратите внимание, что оповещение о близости работает довольно сложно.

Пользователь вводит горячую зону ZONE1 в зависимости от установленной вами точности сигнала и радиуса.Трансляция запускается для ввода = истинной ZONE1.Если вы входите в другую зону ZONE2, которая перекрывается с текущей зоной, вы не получите предупреждение, поскольку вы все еще находитесь в ZONE1.Вы должны покинуть ZONE1, чтобы трансляция возобновилась при вводе = false.Итак, однажды вы вышли из ZONE1, и если вы прибудете в ZONE2, он запустит трансляцию, введя = true ZONE2.

Я протестировал, и все работает отлично.Возьмите Location Spoofer бесплатное приложение с маркета и смоделируйте местоположение телефона.Вам также необходимо включить макет местоположения в настройках телефонов.И добавьте дополнительное разрешение для вашего приложения:

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

Что бы я сделал, установите мое местоположение подальше от меня, возможно, Гренландию, затем установите положение в зоне, которая запускает ZONE1, трансляция должна сработать.Затем снова установите мое местоположение в Грецию и установите позицию, которая запускает ZONE2, трансляция должна срабатывать.

Флаг входа можно получить из дополнительных функций намерений

Bundle b = intent.getExtras();
Boolean entering = (Boolean) b.get(android.location.LocationManager.KEY_PROXIMITY_ENTERING);

Я использовал вышеуказанные коды длянастроить оповещения о близости для 100 POI и все работают хорошо.

...