Hi,
In my application I want that the user is notified that he/she has entered in 
the radius of a particular location. I have the functionality working when the 
application is alive and in the foreground. I will however want that the user 
is also notified when the application is not working and not there in the 
foreground.

In the previous posts I have found out that this can be done by using an 
addProximityAlert().

I have tried to implement the code for adding ProximityAlert with a 
BroadcastReceiver, but its not working some how. Below is the snippet from my 
code (posted below) requesting all to please have a look and help me out with 
it.

<code>
package com.android.locationmang;

public class ViewAActivity extends ListActivity implements LocationListener{

private static final String PROX_ALERT_INTENT = 
"com.android.locationmang.PROX_ALERT_INTENT";
private static final long LOCAL_FILTER_DISTANCE = 1200;
public static List<UserLocation> notifiedLocationsList;

public static Location latestLocation;
PendingIntent pendingIntent;
Intent notificationIntent;
private LocationManager locationManager;
List<UserLocations> userLocations;
private IntentFilter filter;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        notifiedLocationsList = new ArrayList<UserLocation>();
        userLocations = getUserLocations(); //Returns a list of user Locations 
stored by the user on the DB

    filter = new IntentFilter(PROX_ALERT_INTENT);
    }

    private void setUpLocation() {
        locationNotificationReceiver = new LocationNotificationReceiver();

    locationManager = (LocationManager) 
getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
60, 5, this);

        for (int i = 0; i < userLocation.size(); i++){
            UserLocation userLocation = userLocation.get(i); 
            if(!(userLocation.isComplete())){
                setProximityAlert(userLocation.getLatitude(), 
                        userLocation.getLongitude(), 
                        i+1, 
                        i);
            }
        }
        registerReceiver(locationNotificationReceiver, filter);
    }


    private void setProximityAlert(double lat, double lon, final long eventID, 
int requestCode){
            // Expiration is 10 Minutes (10mins * 60secs * 1000milliSecs)
            long expiration = 600000;

            Intent intent = new Intent(this, 
LocationNotificationReceiver.class);
            intent.putExtra(LocationNotificationReceiver.EVENT_ID_INTENT_EXTRA, 
eventID);
            PendingIntent pendingIntent = 
PendingIntent.getBroadcast(getApplicationContext(), requestCode, intent, 
PendingIntent.FLAG_CANCEL_CURRENT);

            locationManager.addProximityAlert(lat, lon, LOCAL_FILTER_DISTANCE, 
expiration, pendingIntent);
        }


    @Override
    protected void onResume() {
        super.onResume();

    setUpLocation();
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
60, 5, this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(this);
        unregisterReceiver(locationNotificationReceiver);
    }

    public void onProviderDisabled(String provider) {}
    public void onProviderEnabled(String provider) {}
    public void onStatusChanged(String provider, int status, Bundle extras) {}


    public boolean userLocationIsWithinGeofence(UserLocation userLocation, 
Location latestLocation, long localFilterDistance) {
        float[] distanceArray = new float[1];
        Location.distanceBetween(userLocation.getLatitude(), 
userLocation.getLongitude(), latestLocation.getLatitude(), 
latestLocation.getLongitude(), userLocation.getAssignedDate(),distanceArray);

        return (distanceArray[0]<localFilterDistance);
    }

    public void onLocationChanged(Location location) {
        if (location != null) {
            latestLocation = location;

            for (UserLocation userLocation : userLocations) {
                if (!(userLocations.isVisited()) && 
userLocationIsWithinGeofence(userLocation, latestLocation, 
LOCAL_FILTER_DISTANCE)) {
                    notifiedLocationsList.add(userLocation);
                }
            }
        }
    }
}
</code>

Code for BroadcastReceiver

<code>
package com.android.locationmang;

public class LocationNotificationReceiver extends BroadcastReceiver {
    private static final int NOTIFICATION_ID = 1000;
    public static final String EVENT_ID_INTENT_EXTRA = "EventIDIntentExtraKey";

    @SuppressWarnings("deprecation")
    @Override
    public void onReceive(Context context, Intent intent) {
        String key = LocationManager.KEY_PROXIMITY_ENTERING;

        long eventID = intent.getLongExtra(EVENT_ID_INTENT_EXTRA, -1);

        Boolean entering = intent.getBooleanExtra(key, false);
        if (entering) {
            Log.d(getClass().getSimpleName(), "entering");
        }
        else{
            Log.d(getClass().getSimpleName(), "exiting");
        }

        String ns = Context.NOTIFICATION_SERVICE;

        NotificationManager mNotificationManager = (NotificationManager) 
context.getSystemService(ns);
        Intent notificationIntent = new Intent(context, 
MarkAsCompleteActivity.class);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, 
notificationIntent, 0);
        Notification notification = createNotification();
        notification.setLatestEventInfo(context, "Proximity Alert!", "You are 
near your point of interest.", pendingIntent);


        mNotificationManager.notify(NOTIFICATION_ID, notification);
    }

    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;
        notification.defaults |= Notification.DEFAULT_LIGHTS;
        notification.ledARGB = Color.WHITE;
        notification.ledOnMS = 1500;
        notification.ledOffMS = 1500;
        return notification;
    }
}
</code>

I have this userLocations list. I am adding Proximity Alert to all the user 
mentioned location by running a for loop for the list. I only want to add a 
proximity Alert to the user location if that particular location has not been 
visited by the user before. I then register the receiver in the 
addLocationProximity() method, which is called from the onResume() method. I 
unregisterReceiver the receiver in the onPause() method.

I have also used the onLocationChanged() method to populate a list (which I 
would be needing for later) based on the same logic which have been used to add 
the proximity alert. I had the code working perfectly when I was working only 
with the onLocationChanged. The problem started when I was using the 
onLocationChanged along with the addProximityAlert. Now the onLocationChanged() 
never gets called. Can someone now why this has broken is there a limitation of 
using these 2 together?

Please do let me know if any of these steps have not been carried out correctly.

Thanks in advance.

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to