允许用户输入地点的名称而不是坐标

时间:2013-06-25 14:32:59

标签: android location alarm

我正在尝试让用户输入他们想要前往的位置(地址)。一旦他们进入并点击“查找坐标”按钮,应用程序应自动获取位置的坐标,并且应该在单击“保存点”按钮时保存。但是当我点击“查找坐标”时,我无法获得坐标。我哪里出错了?请帮忙。提前谢谢。

这是我的代码:

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;

 }
}

1 个答案:

答案 0 :(得分:1)

查看Geocoder API,以便在地理坐标和物理地址之间进行转换。