2011-05-03 56 views
0

我嘗試從MyLocationOverlay提供的經度和緯度獲取當前的郵政編碼,並將其設置爲我的活動上的EditView。使用geocoder與myLocationOverlay

當我嘗試從MyLocationOverlay獲取經度和緯度時,活動崩潰。

此代碼有什麼問題?

問候, 浮動

logcat的輸出:http://codepaste.net/vs6itk 59號線是以下行:

double currentLatitude = myLocationOverlay.getMyLocation().getLatitudeE6(); 

這裏是我的代碼:

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.partner_suche); 

    final EditText tView = (EditText) findViewById(R.id.editTextPLZ); 
    final MapView mView = (MapView) findViewById(R.id.mapview); 
    mView.getController().setZoom(14); 

    List<Overlay> mapOverlays = mView.getOverlays(); 

    myLocationOverlay = new MyCustomLocationOverlay(this, mView); 
    mapOverlays.add(myLocationOverlay); 
    myLocationOverlay.enableMyLocation(); 
    myLocationOverlay.enableCompass(); 
    myLocationOverlay.runOnFirstFix(new Runnable() { 
     public void run() { 
      mView.getController().animateTo(myLocationOverlay.getMyLocation()); 
     } 
    }); 

    Geocoder gc = new Geocoder(this, Locale.getDefault()); 
    double currentLatitude = myLocationOverlay.getMyLocation().getLatitudeE6(); 
    double currentLongitute = myLocationOverlay.getMyLocation().getLongitudeE6(); 

    try 
    { 
     List<Address> addresses = gc.getFromLocation(currentLatitude, currentLongitute, 1); 
     if (addresses.size() > 0) 
     { 
      tView.setText(addresses.get(0).getLocality()); 
     } 
    } catch (IOException e) 
    { 

    } 
} 

編輯: 我創建了一個LocationListener的獲取我的當前位置。現在該部分崩潰,我嘗試運行gc.getFromLocation(latitude,longitude,1);我無法讀取異常? :/

LocationManager locationManager; 
    String context = Context.LOCATION_SERVICE; 
    locationManager = (LocationManager)getSystemService(context); 
    String provider = LocationManager.GPS_PROVIDER; 

    LocationListener locationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      updateWithNewLocation(location); 
      } 

     public void onProviderDisabled(String provider){ 
      updateWithNewLocation(null); 
      } 
     public void onProviderEnabled(String provider){ } 
     public void onStatusChanged(String provider, int status,Bundle extras){ } 
     }; 

    locationManager.requestLocationUpdates(provider, 0, 0, locationListener); 

private void updateWithNewLocation(Location location) { 
    final EditText tView = (EditText) findViewById(R.id.editTextPLZ); 
    double latitude = location.getLatitude(); 
    double longitude = location.getLongitude(); 

    Geocoder gc = new Geocoder(this, Locale.getDefault()); 
    if (location != null) { 
     try 
     { 
      List<Address> addresses = gc.getFromLocation(latitude, longitude, 1); 
      if (addresses.size() > 0) 
      { 
       Address address = addresses.get(0); 
       for (int i = 0; i < address.getMaxAddressLineIndex(); i++){ 
        tView.setText(address.getPostalCode()); 
       } 
      } 
     } catch (Exception e) 
     { 

     } 
    } 

} 
+0

發佈日誌cat輸出。 – Flo 2011-05-03 12:24:19

+0

這裏是logcat輸出:http://codepaste.net/vs6itk第59行是以下行:double currentLatitude = myLocationOverlay.getMyLocation()。getLatitudeE6(); – float 2011-05-03 12:30:03

回答

0

如果您使用的是仿真器API級別8或9,並獲得了異常:

產生java.io.IOException:服務不可用

那麼它是一個已知的bug,請參閱service not available

它在真實設備和仿真器級別7上正常工作。 (你或許應該戴上地址爲空過一個陷阱,雖然這不會使地理編碼的工作!)

+0

Samsung Galaxy Tab使用Android 2.2 Froyo(API Level 8),並且在此設備上,我的應用也崩潰了。不幸的是,我不知道如何從這個設備獲取日誌... – float 2011-05-04 07:01:45

0

最有可能從

myLocationOverlay.getMyLocation() 

Location location = locationManager.getLastKnownLocation(provider); 

返回的位置一片空白。可能是由於您的應用程序尚未收到位置修復程序,並且沒有以前保存過的位置。

嘗試將您執行地理編碼的代碼塊移動到接收修復程序後運行的runnable中。像這樣:

myLocationOverlay.runOnFirstFix(new Runnable() { 
    public void run() { 
     Location loc = myLocationOverlay.getMyLocation(); 
     if (loc != null) { 
      mView.getController().animateTo(loc); 
      Geocoder gc = new Geocoder(this, Locale.getDefault()); 
      double currentLatitude = loc.getLatitudeE6(); 
      double currentLongitute = loc.getLongitudeE6(); 

      try 
      { 
       List<Address> addresses = gc.getFromLocation(currentLatitude, currentLongitute, 1); 
       if (addresses.size() > 0) 
       { 
        tView.setText(addresses.get(0).getLocality()); 
       } 
      } catch (IOException e) 
      { 

      } 
     } 
    } 
}); 
+0

myLocationOverlay.getMyLocation()返回一個Geopoint。如果我嘗試在新的可運行(){}部分中聲明一個Geocoder實例,但我得到一個編譯器錯誤「構造函數Geocoder(new Runnable(){},Locale)未定義」 – float 2011-05-04 06:34:51

+0

對不起。 Geocoder的構造函數需要一個上下文,當你把它放入可運行的時候,「this」不再引用你的活動。嘗試使用getApplicationContext()來代替。 – Clavicle 2011-05-04 12:33:31

+0

謝謝。現在,當我嘗試獲取位置時,它崩潰了。列表

addresses = gc.getFromLocation(currentLatitude,currentLongitute,1);也在模擬器和三星Galaxy Tab上。 – float 2011-05-05 13:30:56