Android — удалить оповещение о близости после уведомления

то, что я пытаюсь сделать, это иметь службу оповещения о приближении, которая запускает уведомление ТОЛЬКО ОДИН РАЗ, когда вы входите в радиус (без остановки службы). мой код запускает уведомления каждый раз, когда вы входите в радиус и каждый раз, когда вы выходите за пределы радиуса. я пробовал с логическими значениями и с removeProximityAlert, но безуспешно. Любые идеи?

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.LocationManager;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class ProximityService extends Service {

    private String PROX_ALERT_INTENT = "com.example.proximityalert";
    private BroadcastReceiver locationReminderReceiver;
    private LocationManager locationManager;
    private PendingIntent proximityIntent;

 @override
    public void onCreate() {
        locationReminderReceiver = new ProximityIntentReceiver();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        double lat = 55.586568;
        double lng = 13.0459;
        float radius = 1000;
        long expiration = -1;

        IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT);
        registerReceiver(locationReminderReceiver, filter);

        Intent intent = new Intent(PROX_ALERT_INTENT);

        intent.putExtra("alert", "Test Zone");

        proximityIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

        locationManager.addProximityAlert(lat, lng, radius, expiration, proximityIntent);

    }

 @override
    public void onDestroy() {
        Toast.makeText(this, "Proximity Service Stopped", Toast.LENGTH_LONG).show();
        try {
            unregisterReceiver(locationReminderReceiver);
        } catch (IllegalArgumentException e) {
            Log.d("receiver", e.toString());
        }

    }

 @override
    public void onStart(Intent intent, int startid) {
        Toast.makeText(this, "Proximity Service Started", Toast.LENGTH_LONG).show();
    }

 @override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }



    public class ProximityIntentReceiver extends BroadcastReceiver {

        private static final int NOTIFICATION_ID = 1000;

     @suppressWarnings("deprecation")
     @override
        public void onReceive(Context arg0, Intent arg1) {

            String place = arg1.getExtras().getString("alert");

            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

            PendingIntent pendingIntent = PendingIntent.getActivity(arg0, 0, arg1, 0);

            Notification notification = createNotification();

            notification.setLatestEventInfo(arg0, "Entering Proximity!", "You are approaching a " + place + " marker.", pendingIntent);

            notificationManager.notify(NOTIFICATION_ID, notification);

            locationManager.removeProximityAlert(proximityIntent);

        }

        private Notification createNotification() {
            Notification notification = new Notification();

            notification.icon = R.drawable.ic_launcher;
            notification.when = System.currentTimeMillis();

            notification.flags |= Notification.FLAG_AUTO_CANCEL;
            notification.flags |= Notification.FLAG_SHOW_LIGHTS;

            notification.defaults |= Notification.DEFAULT_VIBRATE;
            notification.defaults |= Notification.DEFAULT_SOUND;

            return notification;
        }

    }
}

person KKO    schedule 09.05.2013    source источник
comment
вы пытались удалить pendingIntent вместо близостиIntent, возможно, поскольку он уже прошел через него, теперь другой контекст   -  person JRowan    schedule 10.05.2013
comment
я читаю, используя String key = LocationManager.KEY_PROXIMITY_ENTERING; Логический ввод = arg1.getBooleanExtra(key, false); в onRecieve и использование if(entering){}else{} для входа и выхода, но я не смог заставить его работать   -  person JRowan    schedule 10.05.2013
comment
да, что бы проверять вход и выход, но все равно каждый раз уведомляет. ответ, вероятно, был здесь, но больше недоступен   -  person KKO    schedule 10.05.2013
comment
попробуйте locationManager.removeProximityAlert (PendingIntent.getBroadcast (arg0, 0, arg1, PendingIntent.FLAG_ONE_SHOT);   -  person JRowan    schedule 10.05.2013
comment
разве это не то, что сказал другой ответ   -  person JRowan    schedule 10.05.2013
comment
без изменений, по-прежнему уведомляет   -  person KKO    schedule 10.05.2013
comment
да, я так же застрял, как и вы, хотя я плохо оглядываюсь   -  person JRowan    schedule 10.05.2013
comment
единственный способ, который я нашел, - это отменить регистрацию получателя, как в onDestroy. но я думаю, что это не оптимальный путь   -  person KKO    schedule 10.05.2013


Ответы (1)


Вы должны удалить предупреждение о приближении после его срабатывания и не создавать его снова (сохраните какой-либо флаг в качестве переменной или, если вы используете sqlite, в своей базе данных).

Удаление предупреждений немного сложно, нужно выполнить 2 шага, и оба приведут к ожидаемому результату, а не (очевидно) «срабатыванию»:

  1. Отменить регистрацию вашего приемника

    Вы можете сохранить приемник (или массив приемников) и unregister напрямую:

    for (ProximityReceiver proximityReceiverLocal:proximityReceiverArray) {
        context.unregisterReceiver(proximityReceiverLocal);
        proximityReceiverArray.remove(proximityReceiverLocal); // clear pile
    }
    
  2. Удалить оповещения

    Примечание. Вы не можете сохранить оповещение как объект, вы должны заново создать свой PendingIntent и передать его методу removeProximityAlert. Ожидающее намерение должно иметь такое же намерение (то есть тот же action name) и тот же идентификатор ожидающего намерения:

    public void removeProximityAlert(int pendingIntentIdIn, String intentActionNameIn) {
        Intent intent = new Intent(intentActionNameIn);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context , pendingIntentIdIn, intent, 0);
        locationManager.removeProximityAlert(pendingIntent);
    }
    

Если вы удалите одно, а не другое, вы достигнете намеченной цели: ничего не произойдет, когда вы войдете в радиус POI, но вы потратите драгоценное время автономной работы и память.

person tony gil    schedule 23.08.2017