Получить текущее местоположение с помощью json

Привет, я пишу приложение, которое получает текущую широту и долготу и преобразует их в соответствующий адрес. Я могу получить широту и долготу, но как преобразовать их в соответствующий адрес с помощью json. я новичок в json. я попробовал несколько примеров кодов, но не получил адрес

это мой код

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.maps.GeoPoint;



public class GMapActivity extends FragmentActivity {
private GoogleMap map;


       @Override

       protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_map);
              LocationManager locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

              LocationListener locListener = new GpsActivity(getBaseContext());
        locManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, locListener);


              if (map == null) {
                     map = ((SupportMapFragment)  getSupportFragmentManager().findFragmentById(R.id.map))
                             .getMap();

                map.setMyLocationEnabled(true);


              }
       }

       @Override
       public boolean onCreateOptionsMenu(Menu menu) {
              // Inflate the menu; this adds items to the action bar if it is present.
              getMenuInflater().inflate(R.menu.map, menu);
              return true;
       }



              private class GpsActivity implements LocationListener{
                     Marker marker;
                     Context mcontext;
                     public GpsActivity(Context context){
                           super();
                           mcontext=context;
                     }
                     @Override
                     public void onLocationChanged(Location location) {
                           // TODO Auto-generated method stub
                           if (location != null) {

                                  double latitude=location.getLatitude();

                                  double longitude=location.getLongitude();

                                  LatLng gpslocation=new LatLng(latitude,longitude);


                                     Toast.makeText(getApplicationContext(),"" +gpslocation,
                                                      Toast.LENGTH_LONG).show();

Пожалуйста, помогите мне

заранее спасибо


person user2298758    schedule 27.11.2013    source источник


Ответы (1)


Чтобы вернуться к удобочитаемому формату, вы также можете использовать Geocoder, но иногда это не работает из-за проблемы с сервисом Google Play. Я использовал это геокодирование json в качестве второго варианта на всякий случай.

Обратитесь к Google Geocoding API.

Рабочий процесс заключается в передаче вашей широты и долготы и получении текущего местоположения. URL-адрес запроса будет таким.

String reqURL = "http://maps.googleapis.com/maps/api/geocode/json?latlng="+ lat+","+lng +"&sensor=true";

Надеюсь, этот ответ поможет вам.

public static JSONObject getLocationInfo(double lat, double lng) {

    HttpGet httpGet = new HttpGet("http://maps.googleapis.com/maps/api/geocode/json?latlng="+ lat+","+lng +"&sensor=true");
    HttpClient client = new DefaultHttpClient();
    HttpResponse response;
    StringBuilder stringBuilder = new StringBuilder();

    try {
        response = client.execute(httpGet);
        HttpEntity entity = response.getEntity();
        InputStream stream = entity.getContent();
        int b;
        while ((b = stream.read()) != -1) {
            stringBuilder.append((char) b);
        }
    } catch (ClientProtocolException e) {
    } catch (IOException e) {
    }

    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject = new JSONObject(stringBuilder.toString());
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return jsonObject;
}

public static String getCurrentLocationViaJSON(double lat, double lng) {

    JSONObject jsonObj = getLocationInfo(lat, lng);
    Log.i("JSON string =>", jsonObj.toString());

    String currentLocation = "testing";
    String street_address = null;
    String postal_code = null; 

    try {
        String status = jsonObj.getString("status").toString();
        Log.i("status", status);

        if(status.equalsIgnoreCase("OK")){
            JSONArray results = jsonObj.getJSONArray("results");
            int i = 0;
            Log.i("i", i+ "," + results.length() ); //TODO delete this
            do{

                JSONObject r = results.getJSONObject(i);
                JSONArray typesArray = r.getJSONArray("types");
                String types = typesArray.getString(0);

                if(types.equalsIgnoreCase("street_address")){
                    street_address = r.getString("formatted_address").split(",")[0];
                    Log.i("street_address", street_address);
                }else if(types.equalsIgnoreCase("postal_code")){
                    postal_code = r.getString("formatted_address");
                    Log.i("postal_code", postal_code);
                }

                if(street_address!=null && postal_code!=null){
                    currentLocation = street_address + "," + postal_code;
                    Log.i("Current Location =>", currentLocation); //Delete this
                    i = results.length();
                }

                i++;
            }while(i<results.length());

            Log.i("JSON Geo Locatoin =>", currentLocation);
            return currentLocation;
        }

    } catch (JSONException e) {
        Log.e("testing","Failed to load JSON");
        e.printStackTrace();
    }
    return null;
}

По моему опыту, только широта и долгота, сгенерированные устройством, будут работать. Тогда позвони

String currentLocation = getCurrentLocationViaJSON(lat, lng);
person Thein    schedule 27.11.2013
comment
спасибо .. да, я попробовал gecoder, у меня такая же проблема, но мне нужно перезапустить устройство, чтобы получить адрес. я новичок в json, поэтому было бы очень полезно, если бы вы предоставили ссылку на образец учебника или фрагмент кода. еще раз спасибо за помощь.. - person user2298758; 27.11.2013
comment
Вот как обработать ответ json androidhive.info/2012/01/ android-json-parsing-tutorial Удачи! - person Thein; 27.11.2013
comment
спасибо @Megamind, это сработало для меня, не могли бы вы уточнить, что вы подразумеваете под только широта и долгота, сгенерированные устройством, будут работать .. - person user2298758; 03.12.2013
comment
Я имею в виду широту и долготу, полученные от locationManager. Когда я тестирую пользовательскую широту и длину, полученные с карты Google, я не могу использовать этот формат, потому что изменяется массив json. - person Thein; 03.12.2013
comment
HttpClient устарел на уровне API 22 и удален на уровне API 23. Вы можете использовать HttpURLConnection: stackoverflow.com/a/8655039/4244605 - person t0m; 29.03.2017