user2295392
user2295392

Reputation: 25

Allowing users to enter the name of the place rather than the co-ordinates

I am trying to make the users enter the Location (Address) to which they would like to travel to. Once they enter and hit the "Find Coordinates" button, the app should be automatically get the Location's co-ordinates and it should get saved on clicking the "Save Point" button. But I am unable to get the coordinates when I hit the "Find Coordinates". Where have I gone wrong? Please help. Thanks in advance.

Here is my code:

package com.javacodegeeks.android.lbs;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.List;
import java.util.Locale;
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.Address;
import android.location.Geocoder;
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 {
Geocoder gc;
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);
    final EditText ed=(EditText)findViewById(R.id.point_address);
    Button b1=(Button)findViewById(R.id.find_coordinates_button);
    Button b2=(Button)findViewById(R.id.save_point_button);
    final String to_add = ed.getText().toString();


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

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


    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();
            try
            {
                List<Address> address2=gc.getFromLocationName(to_add, 3);
                if (address2 != null && address2.size() >0)
                {
                    double lat1 = address2.get(0).getLatitude();
                    double lng1 = address2.get(0).getLongitude();
                    Toast.makeText(getBaseContext(), "Lat:" +lat1+"Long:"+lng1, Toast.LENGTH_SHORT).show();
                }
            }catch(Exception e)
            {
                e.printStackTrace();
            }

        }
    });

    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) {           
    }
}

}

ProximityIntentReceiver.java

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;

 }
}

Upvotes: 0

Views: 154

Answers (1)

Karakuri
Karakuri

Reputation: 38595

Take a look at the Geocoder APIs for converting between geographic coordinates and physical addresses.

Upvotes: 1

Related Questions