2013-03-29 14 views
22

Sto utilizzando l'API di Google Maps API v2 per Android e funziona correttamente. Tuttavia, sto cercando di usare geocoder per ottenere la longitudine e la latitudine di un indirizzo, ma senza successo.ottiene latitudine e longitudine con geocoder e Android API di Google Maps v2

Ha cambiato il modo di farlo dalla v2?

Sto usando il codice convenzionale

Geocoder gc = new Geocoder(context); 
//... 
    List<Address> list = gc.getFromLocationName("1600 Amphitheatre Parkway, Mountain View, CA", 1); 

    Address address = list.get(0); 

    double lat = address.getLatitude(); 
    double lng = address.getLongitude(); 
//... 

restituisce sempre un arresto forzato, e Log risolve nulla. Quando si usa un blocco di try/catch, apre la mappa ma sempre con la stessa posizione Usa l'autorizzazione Internet, ho incluso anche nel progetto COARSE_LOCATION Ho usato vari codici localizzati qui e su altri siti, ma senza successo.

Grazie in anticipo.

+0

hai il set di autorizzazioni android.permission.INTERNET? – bizzehdee

+1

Hai detto che il registro non risolve nulla, forse dovresti includerlo comunque (scommetto che in realtà abbia qualche indizio su cosa c'è che non va). – Booger

+0

Possiedo i permessi, i registri, grazie: 03-29 22: 25: 10.922: E/AndroidRuntime (4359): java.lang.RuntimeException: impossibile avviare l'attività ComponentInfo {blue.ninja.master/blue.ninja.master .Hola}: java.lang.NullPointerException 03-29 22: 25: 10.922: E/AndroidRuntime (4359): \t su android.app.ActivityThread.access $ 600 (ActivityThread.java:130) 03-29 22:25 : 10.922: E/AndroidRuntime (4359): \t su android.app.ActivityThread 03-29 22: 25: 10.922: E/AndroidRuntime (4359): causato da: java.lang.NullPointerException 03-29 22:25: 10.922: E/AndroidRuntime (4359): \t su blue.ninja.master.Hola.onCreate (Hola.java:50) – Sergio76

risposta

52

Prova questa soluzione che utilizza questo esempio url:

http://maps.google.com/maps/api/geocode/json?address=mumbai&sensor=false

che restituisce i dati in formato json con lat/lng di address.

private class DataLongOperationAsynchTask extends AsyncTask<String, Void, String[]> { 
    ProgressDialog dialog = new ProgressDialog(MainActivity.this); 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     dialog.setMessage("Please wait..."); 
     dialog.setCanceledOnTouchOutside(false); 
     dialog.show(); 
    } 

    @Override 
    protected String[] doInBackground(String... params) { 
     String response; 
     try { 
      response = getLatLongByURL("http://maps.google.com/maps/api/geocode/json?address=mumbai&sensor=false"); 
      Log.d("response",""+response); 
      return new String[]{response}; 
     } catch (Exception e) { 
      return new String[]{"error"}; 
     } 
    } 

    @Override 
    protected void onPostExecute(String... result) { 
     try { 
      JSONObject jsonObject = new JSONObject(result[0]); 

      double lng = ((JSONArray)jsonObject.get("results")).getJSONObject(0) 
        .getJSONObject("geometry").getJSONObject("location") 
        .getDouble("lng"); 

      double lat = ((JSONArray)jsonObject.get("results")).getJSONObject(0) 
        .getJSONObject("geometry").getJSONObject("location") 
        .getDouble("lat"); 

      Log.d("latitude", "" + lat); 
      Log.d("longitude", "" + lng); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     if (dialog.isShowing()) { 
      dialog.dismiss(); 
     } 
    } 
} 


public String getLatLongByURL(String requestURL) { 
    URL url; 
    String response = ""; 
    try { 
     url = new URL(requestURL); 

     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setReadTimeout(15000); 
     conn.setConnectTimeout(15000); 
     conn.setRequestMethod("GET"); 
     conn.setDoInput(true); 
     conn.setRequestProperty("Content-Type", 
       "application/x-www-form-urlencoded"); 
     conn.setDoOutput(true); 
     int responseCode = conn.getResponseCode(); 

     if (responseCode == HttpsURLConnection.HTTP_OK) { 
      String line; 
      BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      while ((line = br.readLine()) != null) { 
       response += line; 
      } 
     } else { 
      response = ""; 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return response; 
} 

Spero che questo ti aiuti.

+0

+1: Thanks..it funziona :) –

+0

@ AmolSawant96Kuli questa soluzione funziona bene? Vi chiedo perché vedo che Geocoder non funziona bene ... – UmbySlipKnot

+0

E 'geocoding lato client o server- lato? Sfortunatamente non riesco a trovare la differenza di codice perché non esiste un esempio corretto. –

7

Provalo.

private void getLatLongFromAddress(String address) 
{ 
    double lat= 0.0, lng= 0.0; 

    Geocoder geoCoder = new Geocoder(this, Locale.getDefault());  
    try 
    { 
     List<Address> addresses = geoCoder.getFromLocationName(address , 1); 
     if (addresses.size() > 0) 
     {    
      GeoPoint p = new GeoPoint(
        (int) (addresses.get(0).getLatitude() * 1E6), 
        (int) (addresses.get(0).getLongitude() * 1E6)); 

      lat=p.getLatitudeE6()/1E6; 
      lng=p.getLongitudeE6()/1E6; 

      Log.d("Latitude", ""+lat); 
      Log.d("Longitude", ""+lng); 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
+0

sembra che il problema sia un bug di Android: http://code.google.com/p/ android/issues/detail? id = 8816 ...Non so come risolverlo: ((( – Sergio76

+0

@MiguelC: potresti trovare LatLng usando l'indirizzo? Sto affrontando lo stesso problema. –

+0

Trovo che per me i risultati siano sempre nel paese sbagliato (anche se includo il paese in – row1

-10

si può ottenere la latitudine e la longitudine della posizione attuale da questo semplice codice

GPS_Location mGPS = new GPS_Location(MyApplication.getAppContext()); 

    if (mGPS.canGetLocation) { 

     mLat = mGPS.getLatitude(); 
     mLong = mGPS.getLongitude(); 

    } else { 
     System.out.println("cannot find"); 
    } 

È necessario aggiungere GPS e altri permessi per la vostra applicazione

+1

Hai mai letto la domanda? –

2

dal momento che il HttpClient è stato deprezzato, si può provare il seguente codice con AsyncTask (da notare anche che abbiamo bisogno di codificare l'indirizzo nel URL):

public class GeoCoding extends AsyncTask<Void, Void, Void> { 
    private String address; 
    private static final String TAG = GeoCoding.class.getSimpleName(); 
    JSONObject jsonObj; 
    String URL; 
    private String Address1 = "", Address2 = "", City = "", State = "", Country = "", County = "", PIN = "", Area=""; 
    private double latitude, longitude; 
    HttpURLConnection connection; 
    BufferedReader br; 
    StringBuilder sb ; 

    public GeoCoding(String address){ 
     this.address = address; 
    } 

    public String getArea(){ 
     return Area; 
    } 

    public void getAddress() { 
     Address1 = ""; 
     Address2 = ""; 
     City = ""; 
     State = ""; 
     Country = ""; 
     County = ""; 
     PIN = ""; 
     Area =""; 

     try { 

      String Status = jsonObj.getString("status"); 
      if (Status.equalsIgnoreCase("OK")) { 
       JSONArray Results = jsonObj.getJSONArray("results"); 
       JSONObject zero = Results.getJSONObject(0); 
       JSONArray address_components = zero.getJSONArray("address_components"); 

       for (int i = 0; i < address_components.length(); i++) { 
        JSONObject zero2 = address_components.getJSONObject(i); 
        String long_name = zero2.getString("long_name"); 
        JSONArray mtypes = zero2.getJSONArray("types"); 
        String Type = mtypes.getString(0); 

        if (! TextUtils.isEmpty(long_name) || !long_name.equals(null) || long_name.length() > 0 || !long_name.equals("")) { 
         if (Type.equalsIgnoreCase("street_number")) { 
          Address1 = long_name + " "; 
         } else if (Type.equalsIgnoreCase("route")) { 
          Address1 = Address1 + long_name; 
         } else if (Type.equalsIgnoreCase("sublocality")) { 
          Address2 = long_name; 
         } else if (Type.equalsIgnoreCase("locality")) { 
          City = long_name; 
         } else if (Type.equalsIgnoreCase("administrative_area_level_2")) { 
          County = long_name; 
         } else if (Type.equalsIgnoreCase("administrative_area_level_1")) { 
          State = long_name; 
         } else if (Type.equalsIgnoreCase("country")) { 
          Country = long_name; 
         } else if (Type.equalsIgnoreCase("postal_code")) { 
          PIN = long_name; 
         }else if(Type.equalsIgnoreCase("neighborhood")){ 
          Area = long_name; 
         } 
        } 
       } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


    } 

    public void getGeoPoint(){ 
     try{ 
      longitude = ((JSONArray)jsonObj.get("results")).getJSONObject(0) 
        .getJSONObject("geometry").getJSONObject("location") 
        .getDouble("lng"); 
      latitude = ((JSONArray)jsonObj.get("results")).getJSONObject(0) 
        .getJSONObject("geometry").getJSONObject("location") 
        .getDouble("lat"); 

     }catch (Exception e){ 
      e.printStackTrace(); 
     } 

    } 


    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      StringBuilder urlStringBuilder = new StringBuilder("http://maps.google.com/maps/api/geocode/json"); 
      urlStringBuilder.append("?address=" + URLEncoder.encode(address, "utf8")); 
      urlStringBuilder.append("&sensor=false"); 
      URL = urlStringBuilder.toString(); 
      Log.d(TAG, "URL: " + URL); 

      URL url = new URL(URL); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestMethod("GET"); 
      connection.setDoInput(true); 
      connection.connect(); 
      br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
      sb = new StringBuilder(); 
      String line; 
      while ((line = br.readLine()) != null) { 
       sb = sb.append(line + "\n"); 
      } 
     }catch (Exception e){e.printStackTrace(); } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     try { 
      Log.d(TAG, "response code: " + connection.getResponseCode()); 
      jsonObj = new JSONObject(sb.toString()); 
      Log.d(TAG, "JSON obj: " + jsonObj); 
      getAddress(); 
      Log.d(TAG, "area is: " + getArea()); 
      getGeoPoint(); 
      Log.d("latitude", "" + latitude); 
      Log.d("longitude", "" + longitude); 


      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     super.onPostExecute(aVoid); 
    } 
} 
0

Un semplice rettifica che ha funzionato per me è quello di consentire solo la connessione internet sul dispositivo. Suggerimento da Pxaml.

Problemi correlati