androidgeolocationbroadcastproximityandroid-pendingintent

Can a broadcastReceiver catch multiple broadcasts?


I am trying to create multiple proximity alerts but I cant get it to work...

I think that the broadcast receiver gets overwritten and thus is handling only the last broadcast. So if I had two points close by only the one whose intent was created last will generate an alert...

I read that I should use request codes but I have no idea on how to do that...


My method for setting up the pending intents and the broadcast receiver...

private void addProximityAlert(double latitude, double longitude, String poiName, String intentfilter) {

    Bundle extras = new Bundle();
    extras.putString("name", poiName);
    Intent intent = new Intent(PROX_ALERT_INTENT+poiName);  
    intent.putExtras(extras);       
    PendingIntent proximityIntent = PendingIntent.getBroadcast(MainMenu.this, requestCode, intent, 0);
    locationManager.addProximityAlert(
        latitude, // the latitude of the central point of the alert region
        longitude, // the longitude of the central point of the alert region
        POINT_RADIUS, // the radius of the central point of the alert region, in meters
        PROX_ALERT_EXPIRATION, // time for this proximity alert, in milliseconds, or -1 to indicate no expiration 
        proximityIntent // will be used to generate an Intent to fire when entry to or exit from the alert region is detected
   );
    requestCode++;
   IntentFilter filter = new IntentFilter(intentfilter); 
   registerReceiver(new ProximityIntentReceiver(), filter);
}

My broadcastreceiver class

public class ProximityIntentReceiver extends BroadcastReceiver {

private static final int NOTIFICATION_ID = 1000;

@Override
public void onReceive(Context context, Intent intent) {

    String key = LocationManager.KEY_PROXIMITY_ENTERING;

    Boolean entering = intent.getBooleanExtra(key, false);

    if (entering) {
        Log.d(getClass().getSimpleName(), "entering");
    }
    else {
        Log.d(getClass().getSimpleName(), "exiting");
    }

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

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, null, 0);        

    Notification notification = createNotification();        
    notification.setLatestEventInfo(context, 
        "Proximity Alert!", "You are approaching: " +intent.getExtras().get("name"), pendingIntent);     
                                                                        //here-------------------------------------
    notificationManager.notify(NOTIFICATION_ID, notification);

}

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

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

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

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

    notification.ledARGB = Color.WHITE;
    notification.ledOnMS = 300;
    notification.ledOffMS = 1500;

    return notification;
}

}

Can you please help me??? I'm really stuck with this...

Any help would be really appreciated!!!


Solution

  • i got it working after all...

    Exactly what I was looking for: http://www.gauntface.co.uk/blog/2010/01/04/proximity-alerts-in-android/

    Modifications I made


    private void addProximityAlert(double latitude, double longitude, String poiName) {
    
        Bundle extras = new Bundle();
        extras.putString("name", poiName);
        extras.putInt("id", requestCode);
        Intent intent = new Intent(PROX_ALERT_INTENT);
        intent.putExtra(PROX_ALERT_INTENT, extras);
        PendingIntent proximityIntent = PendingIntent.getBroadcast(MainMenu.this, requestCode , intent, PendingIntent.FLAG_CANCEL_CURRENT);
        locationManager.addProximityAlert(
            latitude, // the latitude of the central point of the alert region
            longitude, // the longitude of the central point of the alert region
            POINT_RADIUS, // the radius of the central point of the alert region, in meters
            PROX_ALERT_EXPIRATION, // time for this proximity alert, in milliseconds, or -1 to indicate no expiration 
            proximityIntent // will be used to generate an Intent to fire when entry to or exit from the alert region is detected
       );
        requestCode++;       
    }
    
    private void initializeReceiver()
    {
        IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT); 
        registerReceiver(new ProximityIntentReceiver(), filter);
    }
    

    package michaels.pack;
    
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.Color;
    import android.location.LocationManager;
    import android.util.Log;
    
    public class ProximityIntentReceiver extends BroadcastReceiver {
    
    private static final int NOTIFICATION_ID = 1000;
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
        String key = LocationManager.KEY_PROXIMITY_ENTERING;
    
        Boolean entering = intent.getBooleanExtra(key, false);
    
        if (entering) {
            Log.d(getClass().getSimpleName(), "entering receiverrrrrrrrrrrrrrrrrr");
        }
        else {
            Log.d(getClass().getSimpleName(), "exiting");
        }
    
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, null, 0);        
    
        Notification notification = createNotification();        
        notification.setLatestEventInfo(context, 
            "Proximity Alert!", "You are approaching: " +intent.getBundleExtra("michaels.pack.ProximityAlert.").get("name"), pendingIntent);     
                                                                            //here-------------------------------------
        notificationManager.notify( intent.getBundleExtra("michaels.pack.ProximityAlert.").getInt("id"), notification);
    
    }
    
    private Notification createNotification() {
        Notification notification = new Notification();
    
        notification.icon = R.drawable.androidmarker;
        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_LIGHTS;
        notification.defaults |= Notification.DEFAULT_SOUND;
    
        notification.ledARGB = Color.WHITE;
        notification.ledOnMS = 300;
        notification.ledOffMS = 1500;
    
        return notification;
    }
    
    }