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:
- Create a reference to the
LocationManager
class to gain access to the location services and usse thegetSystemService
method to achieve that - Use the
requestLocationUpdates
to get notified when the users changes location - Use the
getLastKnownLocation
to find out the last known location of the GPS device - Use
addProximityAlert
to set up the proximity alert for a given point of interest - Use a
PendingIntent
to generate anIntent
when the user enters or leaves the region of interest.
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: