2010-10-17 8 views
1

Я пытаюсь преобразовать текущие данные Lat/Long GeoCode в область Admin Area и Sub Admin Area, используя класс Geocoder. Я использую NETWORK_PROVIDER в качестве поставщика местоположения. Вот код, который я использую, и он работает. Проблема в том, что иногда это иногда не дает мне места.Обратное геокодирование в приложении для Android

Разрешения манифеста для Android Я использую.

<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 для переданных на него данных долготы широты. Итак, каково должно быть обходное решение? Может быть передана информация Lat/Long в API Карт Google для обратного геокодирования. Будем рады получить любой вход.

ответ

1

Ну вот как я это решил.

Поскольку NETWORK_PROVIDER предоставляет информацию о долготе широты каждый раз, я выбираю это для текущего местоположения пользователя в первую очередь.

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

Я получил Google Maps API Key, а затем использовали его для обратного геокодирования широты, долготы данных из сети провайдера. Это возвращало требуемый адрес и почтовый индекс каждый раз без сбоев.

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(); 
    }