2015-03-13 1 views
1

Ok следующая проблема.Попытка получить LatLng с адреса или местоположения в android

Я пытаюсь взять вмененный адрес или местоположение и вывести LatLng для хранения. Это то, что я до сих пор основал на How can I find the latitude and longitude from address?, третий ответ вниз.

import java.util.List; 

import com.google.android.gms.maps.model.LatLng; 


import android.app.Fragment; 
import android.location.Address; 
import android.location.Geocoder; 

public class Mapping extends Fragment 
{ 


    public LatLng getLocationFromAddress(String _address) { 

     Geocoder coder = new Geocoder(getActivity()); 
     List<Address> address; 
     LatLng p1 = null; 

     try { 
      address = coder.getFromLocationName(_address, 1); 
      if (address == null) { 
       return null; 
      } 
      Address location = address.get(0); 
      location.getLatitude(); 
      location.getLongitude(); 

      p1 = new LatLng(location.getLatitude(), location.getLongitude()); 

     } catch (Exception ex) { 

      ex.printStackTrace(); 
     } 

     return p1; 

Я пытаюсь назвать это в другом классе.

make.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View view) { 
       //String _name = (String) txtName.getText().toString(); 
       //String _address = (String) txtAddress.getText().toString(); 
       String _name = "Some Name"; //Just to pass some information 
       String _address = "New York"; 
       contact.setName(_name); 
       contact.setAddress(_address); 

       // Should populate lladdress with a LatLng 
       LatLng lladdress = mapping.getLocationFromAddress(_address); 
       contact.setLatLng(lladdress); 
      } 
}); 

Весь код до // Should populate lladdress with a LatLng работает, но если я добавить эту часть в мое приложение перестает работать. Я использовал Toast в прошлом, чтобы проверить код, но я не знаю, как это проверить, и я пытаюсь отлаживать и не вижу ничего полезного. Любые идеи о том, что не так с моим кодом?

Обновление: Спасибо @bjiang за ваш код. Я решил изменить его, поэтому выведите двойной 2 и верните его, чтобы я мог хранить его в базе данных или использовать его, как мне нужно позже.

public class Mapping extends Fragment 
 
{ 
 
\t 
 
\t //String[] happy = new String[2]; 
 
\t 
 
\t protected double[] getLatLng(Context context, String address/*, boolean setDestination*/) { 
 
     String uri = "http://maps.google.com/maps/api/geocode/json?address=" 
 
       + address + "&sensor=false"; 
 
     
 
\t \t Message.message(context , ""+uri); 
 

 
     HttpGet httpGet = new HttpGet(uri); 
 

 
     HttpClient client = new DefaultHttpClient(); 
 
     HttpResponse response; 
 
     StringBuilder stringBuilder = new StringBuilder(); 
 

 
     try { 
 
      response = client.execute(httpGet); 
 
      HttpEntity entity = response.getEntity(); 
 

 
      InputStream stream = entity.getContent(); 
 

 
      int byteData; 
 
      while ((byteData = stream.read()) != -1) { 
 
       stringBuilder.append((char) byteData); 
 
      } 
 

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

 
     double[] _latlng = new double[2]; 
 

 
     JSONObject jsonObject; 
 
     try { 
 
      jsonObject = new JSONObject(stringBuilder.toString()); 
 
      _latlng[1] = ((JSONArray) jsonObject.get("results")).getJSONObject(0) 
 
        .getJSONObject("geometry").getJSONObject("location") 
 
        .getDouble("lng"); 
 
      _latlng[0] = ((JSONArray) jsonObject.get("results")).getJSONObject(0) 
 
        .getJSONObject("geometry").getJSONObject("location") 
 
        .getDouble("lat"); 
 

 
     } catch (JSONException e) { 
 
      e.printStackTrace(); 
 
     } 
 
     
 
     
 
\t \t return _latlng;
Он по-прежнему удается, и от того, что я читаю с исключением его метания «android.os.NetworkOnMainThreadException» согласно this сообщению Мне нужно, чтобы запустить его как AsyncTask, но я не уверен, если это правда или как это сделать. мой код выглядит правильно, и есть ли у кого-нибудь другие идеи?

Вот некоторые из журнала:

03-15 12: 30: 05.803: E/AndroidRuntime (17863): неустранимые: Основной

03-15 12: 30: 05.803: Е/AndroidRuntime (17863): Процесс: edu.ecpi.myappv3, ПИД: 17863

03-15 12: 30: 05,803: Е/AndroidRuntime (17863): android.os.NetworkOnMainThreadException

03-15 12: 30: 05.803: E/AndroidRuntime (17863): at android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1147)

03-15 12: 30: 05,803: Е/AndroidRuntime (17863): в java.net.InetAddress.lookupHostByName (InetAddress.java:418)

03-15 12: 30: 05,803: Е/AndroidRuntime (17863): в java.net.InetAddress.getAllByNameImpl (InetAddress.java:252)

03-15 12: 30: 05,803: Е/AndroidRuntime (17863): в java.net.InetAddress.getAllByName (InetAddress .java: 215)

03-15 12: 30: 05,803: Е/AndroidRuntime (17863): в org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection (DefaultClientConnectionOperator.java:172)

03-15 12: 30: 05,803: Е/AndroidRuntime (17863): в org.apache.http.impl.conn.AbstractPoolEntry.open (AbstractPoolEntry.java:167)

+0

один вопрос, в методе getLocationFromAddress, вы возвращаетесь нуль, если метод coder.getFromLocationName возвращает нуль, но в методе, где вызывается метод вы не проверяя, чтобы увидеть, если lladdress имеет нулевое значение, добавить if (lladdress == null) после того, как он вернется из map.getLocationFromAddress – faljbour

ответ

2

я использовал следующий метод, чтобы получить LatLng образуют адрес:

protected void getLatLng(String address) { 
     String uri = "http://maps.google.com/maps/api/geocode/json?address=" 
       + address + "&sensor=false"; 

     HttpGet httpGet = new HttpGet(uri); 

     HttpClient client = new DefaultHttpClient(); 
     HttpResponse response; 
     StringBuilder stringBuilder = new StringBuilder(); 

     try { 
      response = client.execute(httpGet); 
      HttpEntity entity = response.getEntity(); 

      InputStream stream = entity.getContent(); 

      int byteData; 
      while ((byteData = stream.read()) != -1) { 
       stringBuilder.append((char) byteData); 
      } 

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

     double lat = 0.0, lng = 0.0; 

     JSONObject jsonObject; 
     try { 
      jsonObject = new JSONObject(stringBuilder.toString()); 
      lng = ((JSONArray) jsonObject.get("results")).getJSONObject(0) 
        .getJSONObject("geometry").getJSONObject("location") 
        .getDouble("lng"); 
      lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0) 
        .getJSONObject("geometry").getJSONObject("location") 
        .getDouble("lat"); 

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

Вам нужно положить его в AsyncTask к doInBackground для извлечения данных формы Интернета.

Для всего исходного кода проекта, пожалуйста, обратитесь к моему Github here. Это демонстрирует get LatLng form the address, а также может set a marker to there.

enter image description here

+0

Спасибо @bjiang Я обновил свой пост, пожалуйста, посмотрите и посмотрите, сможете ли вы помочь. – Hausfer

+0

, пожалуйста, проверьте весь исходный код на моем github, который поможет вам справиться с asynctask – bjiang

+0

Да, спасибо, я сделал и ответы есть. У меня просто возникают проблемы с его внедрением, как мне это нужно. Я подставляю код через отладку, и похоже, что он получает лат и lng, как он должен, но затем терпит неудачу. Я думаю, что он говорит что-то о попытке прочитать нулевой массив. Я займу немного времени от кода, а затем снова посмотрю на него свежими глазами. Спасибо за вашу помощь. – Hausfer