Попытка получить LatLng с адреса или местоположения в Android

Хорошо, следующая проблема.

Я пытаюсь взять вмененный адрес или местоположение и вывести LatLng для хранения. Это то, что у меня есть до сих пор на основе Как можно Я нахожу широту и долготу по адресу?, третий ответ внизу.

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
{
	
	//String[] happy = new String[2];
	
	protected double[] getLatLng(Context context, String address/*, boolean setDestination*/) {
        String uri = "http://maps.google.com/maps/api/geocode/json?address="
                + address + "&sensor=false";
        
		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();
        }
        
        
		return _latlng;
It is still failing and from what I am reading from the exception it is throwing "android.os.NetworkOnMainThreadException" according to this post I need to run it as an AsyncTask but I am not sure if this is true or how to do it. does my code look right and does anyone have any other ideas?

Вот часть журнала:

03-15 12:30:05.803: E/AndroidRuntime(17863): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной

03–15 12:30:05.803: E/AndroidRuntime (17863): процесс: edu.ecpi.myappv3, PID: 17863

03–15 12:30:05.803: E/AndroidRuntime (17863): android.os.NetworkOnMainThreadException

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

03-15 12:30:05.803: E/AndroidRuntime(17863): в java.net.InetAddress.lookupHostByName(InetAddress.java:418)

03-15 12:30:05.803: E/AndroidRuntime(17863): в java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)

03-15 12:30:05.803: E/AndroidRuntime(17863): в java.net.InetAddress.getAllByName(InetAddress.java:215)

03–15 12:30:05.803: E/AndroidRuntime (17863): в org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:172)

03-15 12:30:05.803: E/AndroidRuntime(17863): в org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:167)


person Hausfer    schedule 13.03.2015    source источник
comment
одна проблема: в вашем методе getLocationFromAddress вы возвращаете значение null, если метод coder.getFromLocationName возвращает значение null, но в вашем методе, где вызывается метод, который вы не проверяете, чтобы увидеть, имеет ли lladdress значение null, добавьте if(lladdress==null) после он возвращается из сопоставления.getLocationFromAddress   -  person faljbour    schedule 14.03.2015


Ответы (1)


Я использовал следующий метод, чтобы получить адрес формы 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 здесь. Это демонстрирует get LatLng form the address, а также может set a marker to there.

введите здесь описание изображения

person bjiang    schedule 13.03.2015
comment
Спасибо @bjiang, я обновил свой пост, пожалуйста, посмотрите и посмотрите, можете ли вы помочь. - person Hausfer; 15.03.2015
comment
пожалуйста, проверьте весь исходный код на моем github, это поможет вам справиться с асинхронной задачей - person bjiang; 16.03.2015
comment
Да, спасибо, я сделал, и ответы есть. У меня просто проблемы с реализацией так, как мне это нужно. Я пропускаю код через отладку, и похоже, что он получает lat и lng, как и должен, но затем терпит неудачу. Я думаю, что это что-то говорит о попытке прочитать нулевой массив. Я немного отвлекусь от кода, а затем снова взгляну на него свежим взглядом. Спасибо за вашу помощь. - person Hausfer; 16.03.2015