Опитвате се да получите 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 връщате нула, ако методът coder.getFromLocationName връща нула, но във вашия метод, където извикайте метода, който не проверявате, за да видите дали lladdress е нула, добавете if(lladdress==null) след връща се от mapping.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, ще ви помогне да се справите с asynctask - person bjiang; 16.03.2015
comment
Да, благодаря, направих и отговорите са там. Просто имам проблеми с прилагането му по начина, по който имам нужда. Проследявам кода през отстраняването на грешки и изглежда, че получава ширината и дължината, както трябва, но след това се проваля. Мисля, че казва нещо за опит за четене на нулев масив. Ще отделя малко време от кода, след което ще го разгледам отново със свежи очи. Благодаря за вашата помощ. - person Hausfer; 16.03.2015