location

Proximity Alerts Example

One of the most used features in smartphones is the GPS devices that are embedded in the phones. Additionally more and more Applications are developed and launched that take advantage of the geographical positioning functionality. You have probably already heard about Location Based Services.

In this tutorial we are going to create an Application that notifies the user when he/she have are approaching a point of interest that he/she specified its coordinates.
 
 
 
 

To be more specific, in order to create an Android Application that provides proximity Alerts you have to take the following steps:

Let’s see how the code looks like:
package com.javacodegeeks.android.lbs;

import java.text.DecimalFormat;
import java.text.NumberFormat;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class ProxAlertActivity extends Activity {

    private static final long MINIMUM_DISTANCECHANGE_FOR_UPDATE = 1; // in Meters
    private static final long MINIMUM_TIME_BETWEEN_UPDATE = 1000; // in Milliseconds

    private static final long POINT_RADIUS = 1000; // in Meters
    private static final long PROX_ALERT_EXPIRATION = -1; 

    private static final String POINT_LATITUDE_KEY = "POINT_LATITUDE_KEY";
    private static final String POINT_LONGITUDE_KEY = "POINT_LONGITUDE_KEY";

    private static final String PROX_ALERT_INTENT = 

   "com.javacodegeeks.android.lbs.ProximityAlert";

    private static final NumberFormat nf = new DecimalFormat("##.########");

    private LocationManager locationManager;

    private EditText latitudeEditText;
    private EditText longitudeEditText;
    private Button findCoordinatesButton;
    private Button savePointButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

  locationManager.requestLocationUpdates(

LocationManager.GPS_PROVIDER, 

MINIMUM_TIME_BETWEEN_UPDATE, 

MINIMUM_DISTANCECHANGE_FOR_UPDATE,

new MyLocationListener()

  );

  latitudeEditText = (EditText) findViewById(R.id.point_latitude);

  longitudeEditText = (EditText) findViewById(R.id.point_longitude);

  findCoordinatesButton = (Button) findViewById(R.id.find_coordinates_button);

  savePointButton = (Button) findViewById(R.id.save_point_button);

  findCoordinatesButton.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

    populateCoordinatesFromLastKnownLocation();

}

  });

  savePointButton.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

    saveProximityAlertPoint();

}

  });

    }

    private void saveProximityAlertPoint() {

  Location location = 

locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

  if (location==null) {

Toast.makeText(this, "No last known location. Aborting...", 

    Toast.LENGTH_LONG).show();

return;

  }

  saveCoordinatesInPreferences((float)location.getLatitude(),

   (float)location.getLongitude());

  addProximityAlert(location.getLatitude(), location.getLongitude());
    }

    private void addProximityAlert(double latitude, double longitude) {

  Intent intent = new Intent(PROX_ALERT_INTENT);

  PendingIntent proximityIntent = PendingIntent.getBroadcast(this, 0, 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

 );

 IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT);  

 registerReceiver(new ProximityIntentReceiver(), filter);

    }

    private void populateCoordinatesFromLastKnownLocation() {

  Location location = 

locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

  if (location!=null) {

latitudeEditText.setText(nf.format(location.getLatitude()));

longitudeEditText.setText(nf.format(location.getLongitude()));

  }
    }

    private void saveCoordinatesInPreferences(float latitude, float longitude) {

  SharedPreferences prefs = 

     this.getSharedPreferences(getClass().getSimpleName(),

   Context.MODE_PRIVATE);

  SharedPreferences.Editor prefsEditor = prefs.edit();

  prefsEditor.putFloat(POINT_LATITUDE_KEY, latitude);

  prefsEditor.putFloat(POINT_LONGITUDE_KEY, longitude);

  prefsEditor.commit();
    }

    private Location retrievelocationFromPreferences() {

  SharedPreferences prefs = 

     this.getSharedPreferences(getClass().getSimpleName(),

   Context.MODE_PRIVATE);

  Location location = new Location("POINT_LOCATION");

  location.setLatitude(prefs.getFloat(POINT_LATITUDE_KEY, 0));

  location.setLongitude(prefs.getFloat(POINT_LONGITUDE_KEY, 0));

  return location;
    }

    public class MyLocationListener implements LocationListener {

  public void onLocationChanged(Location location) {

Location pointLocation = retrievelocationFromPreferences();

float distance = location.distanceTo(pointLocation);

Toast.makeText(ProxAlertActivity.this, 

  "Distance from Point:"+distance, Toast.LENGTH_LONG).show();

  }

  public void onStatusChanged(String s, int i, Bundle b) {

  }

  public void onProviderDisabled(String s) {

  }

  public void onProviderEnabled(String s) {

  }
    }

}
package com.javacodegeeks.android.lbs;

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");

  }

  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 near your point of interest.", pendingIntent);

  notificationManager.notify(NOTIFICATION_ID, notification);

    }

    private Notification createNotification() {

  Notification notification = new Notification();

  notification.icon = R.drawable.ic_menu_notifications;

  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.ledARGB = Color.WHITE;

  notification.ledOnMS = 1500;

  notification.ledOffMS = 1500;

  return notification;
    }

}
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.javacodegeeks.android.lbs"

android:versionCode="1"

android:versionName="1.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

  <activity android:name=".ProxAlertActivity"

android:label="@string/app_name">

<intent-filter>

    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

  </activity>     

    </application>

    <uses-sdk android:minSdkVersion="3" />

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

</manifest>

 
This was an Example on how to use Proximity Alerts on Android.

Related Article:

Ilias Tsagklis

Ilias is a software developer turned online entrepreneur. He is co-founder and Executive Editor at Java Code Geeks.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
Back to top button