2010-10-17 4 views
1

J'essaie d'inverser les données actuelles Lat/Long de GeoCode vers la zone d'administration et la zone d'administration secondaire en utilisant la classe de géocodeur. J'utilise NETWORK_PROVIDER en tant que fournisseur de localisation. Voici le code que j'utilise et ça marche. Le problème est parfois que cela ne me donne pas de localisation, parfois c'est le cas.Géocodage inversé dans l'application Android

Autorisations du manifeste Android J'utilise.

<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"/> 

Voici le reste du code qui me donne l'emplacement correct de temps en temps mais rien d'autre à d'autres moments.

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

Y a-t-il des restrictions avec les fournisseurs de réseau à quelle fréquence vous pouvez demander des données de localisation?

Comment puis-je m'assurer que chaque fois que je l'exécute, cela peut me donner des données de localisation valides.

Merci d'avance pour tout renseignement à ce sujet. PS: J'ai exécuté ce code sur mon appareil réel fonctionnant sous Froyo 2.2 (Verizon Wireless). Niveau de l'API cible 8.

Voici ce que j'ai obtenu lors de mon débogage.

Latitude Longitude est toujours récupérée, mais la propriété getFromLocation renvoie souvent la valeur null pour les données de longitude de latitude qui lui sont transmises. Alors, quelle devrait être la solution de contournement? Peut être passer l'information Lat/Long à l'API Google Maps pour le géocodage inverse. Sera heureux de recevoir toute contribution.

Répondre

1

Eh bien voici comment je l'ai résolu.

Étant donné que le NETWORK_PROVIDER fournit les informations de longitude de latitude sans échec à chaque fois, je récupère cela pour l'emplacement actuel de l'utilisateur en premier.

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

J'obtenu la Google Maps API Key puis utilisé pour Géocodage inverse la latitude, les données de longitude du fournisseur de réseau. Cela a retourné l'adresse requise et le code postal à chaque fois sans faute.

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