2013-06-25 92 views
0

我試圖讓用戶輸入他們想要前往的位置(地址)。一旦他們進入並點擊「查找座標」按鈕,應用程序應自動獲取位置的座標,並在點擊「保存點」按鈕時保存。但是當我點擊「查找座標」時,我無法獲得座標。我哪裏錯了?請幫忙。提前致謝。允許用戶輸入地點的名稱而不是座標

這裏是我的代碼:

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

看看在Geocoder API進行地理座標和物理地址之間的轉換。

+0

一旦他們輸入座標並點擊「查找座標」按鈕,應用程序應該自動獲取位置的座標,並且它應該在點擊「保存點」按鈕時被保存。但是當我點擊「查找座標」時,我無法獲得座標。 – user2295392

+0

有幾件事情:1)並非所有設備都有GPS提供商。您應該遍歷所有可用的提供程序('locationManager.getAllProviders()'),並請求更新,如果它們都沒有位置。 2)考慮使用Google Play服務庫的新位置API。它耗盡了很多選擇最佳提供商和管理所有這些工作的工作。 – Karakuri