2010-10-17 42 views
1

我正在嘗試使用Geocoder類將GeoCode當前的緯度/長度數據反轉爲管理區和子管理區。 我正在使用NETWORK_PROVIDER作爲位置提供程序。這裏是我使用的代碼,它的工作原理。問題有時它並不會給我任何位置。Android應用程序中的反向地理編碼

我正在使用Android Manifest權限。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET"/> 

下面是剩餘的代碼,不時給我正確的位置,但在其他時間沒有。

  double latPoint = 0; 
      double lngPoint = 0; 
      List<Address> myList = null; 
      getApplicationContext(); 
      LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
      Location recentLoc = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
      if (recentLoc != null){ 
      latPoint = recentLoc.getLatitude(); 
      lngPoint = recentLoc.getLongitude(); 

      Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault()); 
      if (myLocation != null){ 
      try { 
       myList = myLocation.getFromLocation(latPoint, lngPoint, 1); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 

      if (myList.size()> 0){ 
         String AdminArea = myList.get(0).getAdminArea(); 
         String SubAdminArea = myList.get(0).getSubAdminArea(); 
         String Zipcode = myList.get(0).getPostalCode(); 

         String urlocation = SubAdminArea + ", " + AdminArea + " " + Zipcode; 

         Context context1 = getApplicationContext(); 
         int duration1 = Toast.LENGTH_LONG; 
         CharSequence text1 = urlocation; 
         Toast toast1 = Toast.makeText(context1, text1, duration1); 
         toast1.show(); 
      } 
      } 

網絡提供商是否有限制您可以請求位置數據的頻率?

我該如何確保每次運行時都能給出有效的位置數據。

非常感謝您對此的深入瞭解。

PS:我在運行Froyo 2.2(Verizon Wireless)的真實設備上運行此代碼。目標API級別8.

這是我從調試中得到的。

緯度經度總是被提取,但getFromLocation經常爲傳遞給它的緯度經度數據返回null。那麼該如何解決?可能會將經緯度/長信息傳遞給Google Maps API進行反向地理編碼。很高興收到任何意見。

回答

1

那麼這就是我解決它的方法。

由於NETWORK_PROVIDER每次都提供緯度經度信息,所以我首先獲取用戶當前的位置。

latPoint = recentLoc.getLatitude(); lngPoint = recentLoc.getLongitude();

我獲得的谷歌地圖API密鑰,然後用它來反向地理緯度,從網絡提供商經度數據。每次都會返回所需的地址和郵政編碼。

1
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET"/> 

    public static String getUserLocation(String lat, String lon) { 
     String userlocation = null; 
     String readUserFeed = readUserLocationFeed(lat.trim() + ","+ lon.trim()); 
     try { 
      JSONObject Strjson = new JSONObject(readUserFeed); 
      JSONArray jsonArray = new JSONArray(Strjson.getString("results")); 
      userlocation = jsonArray.getJSONObject(1) 
        .getString("formatted_address").toString(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     Log.i("User Location ", userlocation); 
     return userlocation; 
    } 



     public static String readUserLocationFeed(String address) { 
     StringBuilder builder = new StringBuilder(); 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?latlng="+ address + "&sensor=false"); 
     try { 
      HttpResponse response = client.execute(httpGet); 
      StatusLine statusLine = response.getStatusLine(); 
      int statusCode = statusLine.getStatusCode(); 
      if (statusCode == 200) { 
       HttpEntity entity = response.getEntity(); 
       InputStream content = entity.getContent(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        builder.append(line); 
       } 
      } else { 
       Log.e(ReverseGeocode.class.toString(), "Failed to download file"); 
      } 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return builder.toString(); 
    }