0

Hi all,

I'm writing a scavenger hunt app and want to use the Proximity Alert functions. I'm having a hard time to finding any decent tutorials to help me with this. Does anyone have a code snippet on it's use that I can go off of?

Much appreciated,
Hendo

3
Contributors
6
Replies
61
Views
3 Years
Discussion Span
Last Post by Hendo
0

There is. I just don't understand exactly how to implement it for proximity alerts. I'm trying to write a scavenger hunt app. I have the GPS points for the 10 locations. Once the device gets within the radius of one of the locations, I want some text to show up on the screen.

I am using the location manager to getLastKnowLocation, though I don't even think that is necessary. I want to use the ProximityAlert functions to pop up the appropriate text for the relevent locations. I just can't find any helpful tutorials for writing that code.

Thanks,
Hendo

0

Traevel, I have done that one. And actually, I'm using that to gather my GPS points...it's kind of handy.

I am using LocationManager to add proximity way points.
lm.addProximityAlert (38.19776, -84.8672, 3, 5000, proximityIntent);

I just can't figure out how to get the text to show on the screen when I trigger that proximity alert. All the text is in my String.xml file. How do I get the text to pop up in my TextView box?

I feel like an idiot. I thought this was going to be pretty straight forward.

Thanks,
Hendo

0

Ok, forget about getting the text to show up, the proximity alerts are just not firing off. Here's the main code...

public class FCRun extends Activity {

    private static final long MINIMUM_DISTANCECHANGE_FOR_UPDATE = 9;                // in meters
    private static final long MINIMUM_TIME_BETWEEN_UPDATE = 15000;                  // in Milliseconds
    private static final long POINT_RADIUS = 6;                                     // 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 = "King Hendo Tools";

    private LocationManager lm;
    private MyLocationListener mylistener;

    private IntentFilter intFilter;


     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fcrun);

            // Get the location Manager  (code from http://examples.javacodegeeks.com/android/core/location/android-location-based-services-example/)
            lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            lm.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER,
                    MINIMUM_TIME_BETWEEN_UPDATE,
                    MINIMUM_DISTANCECHANGE_FOR_UPDATE,
                    new MyLocationListener());

            // the last known location of the provider
            Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

            mylistener = new MyLocationListener();

            if (location != null) {
                mylistener.onLocationChanged(location);
            } else {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(intent);
            }
            // location updates: at least 15 meters and 10 seconds change
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 15, mylistener);

     }

    private class MyLocationListener implements LocationListener {
         @Override
         public void onLocationChanged(Location location) {

         }
         @Override
         public void onProviderDisabled(String provider) {

         }
         @Override
         public void onProviderEnabled(String provider) {

         }
         @Override
         public void onStatusChanged(String provider, int status, Bundle extras) {

         }
     }

     private void addProximityAlert(double latitude, double longitude) {
         Intent intent = new Intent(PROX_ALERT_INTENT);
         PendingIntent proximityIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

         /*
         lm.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
                 );
                 */  
         lm.addProximityAlert (38.19776, -84.8672, 6, 10000, proximityIntent);
         lm.addProximityAlert (38.196, -84.8674, 6, 10000, proximityIntent);
         lm.addProximityAlert (38.19518, -84.8666, 6, 10000, proximityIntent);
         lm.addProximityAlert (38.19472, -84.8661, 6, 10000, proximityIntent);
         lm.addProximityAlert (38.19388, -84.8649, 6, 10000, proximityIntent);
         lm.addProximityAlert (38.19353, -84.8647, 6, 10000, proximityIntent);
         lm.addProximityAlert (38.19373, -84.8661, 6, 10000, proximityIntent);

         IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT);
         registerReceiver(new ProximityIntentReceiver(), filter);
     }

     @Override
     protected void onResume() {
         super.onResume();
         lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 15, mylistener);
     }

     @Override
     protected void onPause() {
         super.onPause();
         lm.removeUpdates(mylistener);
     }



}

And here is the receiver code...

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);
        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_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_LIGHTS;

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

        return notification;
    }

}

What am I missing here? When I send GPS coordinates throught the DDMS, my alerts are not firing off.

Thanks,
Hendop

Edited by Hendo: misspelling

0

Ok, I've resolved the proximity alert problem. I am now firing off the various alerts that I've added.

The last part of this problem is that I have assigned an ID for each of the proximity alerts. I need to pass that ID to the receiver (I think) so that when a proximity alert is fired, the corresponding ID can be used to populate the text fields. Here's the updated code for the activity:

public class FCRun extends Activity implements LocationListener  {

    private static final long MINIMUM_DISTANCECHANGE_FOR_UPDATE = 1;                // in meters
    private static final long MINIMUM_TIME_BETWEEN_UPDATE = 5000;                   // in Milliseconds
    private static final long EXPIRE = -1;                          // -1 is never expires
    public static final String PROX_ALERT_INTENT = "com.kinghendo.android.frankcem.ProximityAlert";
    //public static final int KEY_LOCATION_CHANGED = 0;
    private LocationManager lm;
    double latitude, longitude;
    public int ID;
    public String[] Screen;
    private ProximityIntentReceiver proximityReceiver;
    //private String[] locationList;

    // setting default screen text
    public TextView txtName;
    public TextView txtInfo;
    public TextView txtClue;



     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fcrun);

            @SuppressWarnings("unused")
            Resources res = getResources();

            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.first);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+PROX_ALERT_INTENT);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.first);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+PROX_ALERT_INTENT);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.first);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+PROX_ALERT_INTENT);


         // Get the location Manager  (code from http://examples.javacodegeeks.com/android/core/location/android-location-based-services-example/)
            lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            lm.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER,
                    MINIMUM_TIME_BETWEEN_UPDATE,
                    MINIMUM_DISTANCECHANGE_FOR_UPDATE,
                    this
            );

            IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT);
            proximityReceiver = new ProximityIntentReceiver();                      // registers ProximityIntentReceiver
            registerReceiver(proximityReceiver, filter);

            addProximityAlerts();

     }

     private void addProximityAlerts(){
         Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
         if (loc == null)
             Toast.makeText(this, "No location", Toast.LENGTH_SHORT).show();
         else
             addProximityAlert(loc.getLatitude(), loc.getLongitude(), 3, 0);
             addProximityAlert (38.042015, -84.492637, 10, 27);                 // test Awesome
             addProximityAlert (38.085705, -84.56110000000001, 10, 26);         // Test Home Location
             addProximityAlert (38.15264962, -84.89520585, 10, 25);             // Test Office Location
             addProximityAlert (38.19787138, -84.86692458, 10, 1);              // Information Center
             addProximityAlert (38.19600161, -84.86743554, 6, 2);               // Goebel
             addProximityAlert (38.2031917, -84.8676742, 7, 3);                 // Chapel
             addProximityAlert (38.1921737, -84.870451, 6, 4);                  // Confederate Cemetery
             addProximityAlert (38.1934558, -84.8685347, 2, 5);                 // O'Bannon
             addProximityAlert (38.19381509, -84.86490403, 2, 6);               // Henry Clay Jr
             addProximityAlert (38.0873887, -84.5475033, 2, 7);                 // O'Hara
             addProximityAlert (38.1916428, -84.8709677, 10, 8);                // Daniel Boone
     }


    private void addProximityAlert(double latitude, double longitude, int radius, int ID) {
        Log.i("TEST", "addProximityAlert "+latitude+", "+longitude+", "+radius+", "+ID+", "+EXPIRE);

        Intent intent = new Intent(PROX_ALERT_INTENT);
        intent.putExtra("ID", ID);
        PendingIntent proximityIntent = PendingIntent.getBroadcast(this, ID, intent, PendingIntent.FLAG_UPDATE_CURRENT);    //FLAG_UPDATE_CURRENT); instead of 0);

        lm.addProximityAlert(latitude, longitude, radius, ID, proximityIntent);
        //lm.addProximityAlert(latitude, longitude, radius, EXPIRE, proximityIntent);

    }

     @Override
     public void onLocationChanged(Location location) {
         int ID = getIntent().getIntExtra("ID", 0);

         //String provider = location.getProvider();
         latitude = location.getLatitude();
         longitude = location.getLongitude();
         //int ID = Integer.valueOf(PROX_ALERT_INTENT);
         Log.i("TEST", "lat: "+latitude+" lng: "+longitude+" "+PROX_ALERT_INTENT);

         switch (ID){
         case 1:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.start);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.start);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.start);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
             break;
         case 2:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.goebel);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.goebel);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.goebel);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
             break;
         case 3:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.church);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.church);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.church);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
             break;
         case 4:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.confederate);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.confederate);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.confederate);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
             break;
         case 5:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.obannon);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.obannon);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.obannon);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
             break;
         case 6:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.hcj);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.hcj);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.hcj);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
             break;
         case 7:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.ohara);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.ohara);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.ohara);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
             break;
         case 8:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.danielboone);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.danielboone);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.danielboone);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
             break;
         case 25:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.toffice);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.toffice);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.toffice);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
             break;
         case 26:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.thome);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.thome);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.thome);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
             break;
         case 27:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.tawesome);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.tawesome);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.tawesome);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
             break;
         default:
            txtName = (TextView) findViewById(R.id.txtName);
            Screen = getResources().getStringArray(R.array.first);
            txtName.setText(Screen[0]);
            Log.i("txtName", "populated "+ID);

            txtInfo = (TextView) findViewById(R.id.txtInfo);
            Screen = getResources().getStringArray(R.array.first);
            txtInfo.setText(Screen[1]);
            Log.i("txtInfo", "populated "+ID);

            txtClue = (TextView)findViewById(R.id.txtClue);
            Screen = getResources().getStringArray(R.array.first);
            txtClue.setText(Screen[2]);
            Log.i("txtClue", "populated "+ID);
            break;


         }


     }

     @Override
     public void onProviderDisabled(String provider) {

     }
     @Override
     public void onProviderEnabled(String provider) {

     }
     @Override
     public void onStatusChanged(String provider, int status, Bundle extras) {

     }

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

     @Override
     protected void onPause() {
         super.onPause();
     }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        lm.removeUpdates(this);
        unregisterReceiver(proximityReceiver);

    }
}

and here is the code for the receiver:

public class ProximityIntentReceiver extends BroadcastReceiver {

    private static final int NOTIFICATION_ID = 1000;
    private int ID = 0;
    //int i;

    @Override
    public void onReceive(Context context, Intent intent) {
        //int i;
        String key = LocationManager.KEY_PROXIMITY_ENTERING;
        Bundle results = getResultExtras(true);
        Boolean entering = intent.getBooleanExtra(key, false);

        if (entering) {
            long lat = intent.getLongExtra("location-lat", -1);
            long lon = intent.getLongExtra("location-lon", -1);
            int ID = intent.getIntExtra("ID", 0);
            Log.i("", "entering: " + lat + lon + ID);
            Log.d(getClass().getSimpleName(), "entering receiverrrrrrrrrrrrrrrrrr");
        }
        else {
            long lat = intent.getLongExtra("location-lat", -1);
            long lon = intent.getLongExtra("location-lon", -1);
            Log.i("", "exiting: " + lat + lon);
            Log.d(getClass().getSimpleName(), "exiting");
        }

     // Vibrate for 2 seconds
        Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(2000);

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

        PendingIntent pendingIntent = PendingIntent.getActivity(context, ID, new Intent(FCRun.PROX_ALERT_INTENT), 0);        

        Notification noti = new Notification.Builder(context)
        .setContentTitle("Location Alert ")
        .setContentText("Entering Point of Interest")
        .setSmallIcon(R.drawable.ic_launcher)
        .setContentIntent(pendingIntent)
        .setAutoCancel(true)
        .build(); // available from API level 11 and onwards

        notificationManager.notify(NOTIFICATION_ID, noti);
     }
}

Obviously, I'm not getting my intents correct. Please help!

Thanks,
Hendo

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.