Gps android - 获得纬度和经度

时间:2011-05-23 17:55:53

标签: java android geolocation

你能帮我解决这个问题吗?当我添加地理编码器以通过使用纬度和经度获取城市名称时,应用程序开始崩溃..

    double latitude, longitude;
    private TextView lala;

    LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    longitude = location.getLongitude();
    latitude = location.getLatitude();
    final LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            longitude = location.getLongitude();
            latitude = location.getLatitude();
        }

        public void onProviderDisabled(String arg0) {
            // TODO Auto-generated method stub

        }

        public void onProviderEnabled(String arg0) {
            // TODO Auto-generated method stub

        }

        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
            // TODO Auto-generated method stub

        }
    };

    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
    lala = (TextView) findViewById(R.id.textView1);

    Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
    List<Address> myList = null;
    try {
        myList = myLocation.getFromLocation(latitude, longitude, 1);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }


    lala.setText((CharSequence) myList);

2 个答案:

答案 0 :(得分:8)

lm.getLastKnownLocation可以返回null,然后尝试getLongitude()您将获得NullPointerException

lala.setText((CharSequence) myList);也可以这样做(抛出异常)因为'myList在这里可以为null(如果Geocoder失败)。

修改 要处理Geocoder中的异常,请考虑以下清单

  1. 确保您的纬度和经度不为空
  2. 确保-90&lt; = latitude&lt; = 90和-180&lt; =经度&lt; = 180
  3. 确保您有可用的网络连接
  4. <强> EDIT2 改进代码

    private TextView lala;
    
    LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    
    if(location != null) {
        showMyAddress(location);
    }
    
    final LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            showMyAddress(location);
        }
    
        public void onProviderDisabled(String arg0) {
            // TODO Auto-generated method stub
    
        }
    
        public void onProviderEnabled(String arg0) {
            // TODO Auto-generated method stub
    
        }
    
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
            // TODO Auto-generated method stub
    
        }
    };
    
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
    lala = (TextView) findViewById(R.id.textView1);
    
    
    
    // Also declare a private method
    
    private void showMyAddress(Location location) {
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
        List<Address> myList;
        try {
            myList = myLocation.getFromLocation(latitude, longitude, 1);
            if(myList.size() == 1) {
                lala.setText(myList.get(0).toString());             
            }
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
    

答案 1 :(得分:2)

Criteria criteria = new Criteria();
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
String provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
int la = (int) (location.getLatitude() * 1E6);
int lo = (int) (location.getLongitude() * 1E6);