38

描述:我正在使用Google maps API V2。我已经Android Reverse Geocoding在触摸的位置实现。

问题:它抛出异常

 try {
     addresses = geocoder.getFromLocation(latitude, longitude,1);}
 catch (IOException e)
     {
     e.printStackTrace();
     if(AppConstants.DEBUG)Log.v(AppConstants.DEBUG_TAG," e.printStackTrace(): "+e.getMessage());
     }

我收到latitude并且longitude值正确,但我不明白它为什么会抛出exception,我也做过谷歌搜索,但它无济于事。

谁能详细解释一下??

4

3 回答 3

86

如本Android 问题 38009 - Geocoder throwing exception: IOException: Service not Available Rebooting the Device 中所述,将解决问题

于 2013-04-20T11:30:12.577 回答
16

如果您不想重新启动设备,请使用此

     public  JSONObject getLocationFormGoogle(String placesName) {

    HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?address=" +placesName+"&ka&sensor=false");
    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  LatLng getLatLng(JSONObject jsonObject) {

    Double lon = new Double(0);
    Double lat = new Double(0);

    try {

        lon = ((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) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return new LatLng(lat,lon);

}



LatLng Source =getLatLng(getLocationFormGoogle(placesName));
于 2014-02-27T07:17:05.420 回答
10

我修改了@Ani 解决方案以从 lat long 参数中获取城市名称:

public static String getLocationCityName( double lat, double lon ){
    JSONObject result = getLocationFormGoogle(lat + "," + lon );
    return getCityAddress(result);
}

protected static JSONObject getLocationFormGoogle(String placesName) {

    String apiRequest = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" + placesName; //+ "&ka&sensor=false"
    HttpGet httpGet = new HttpGet(apiRequest);
    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;
}

protected static String getCityAddress( JSONObject result ){
    if( result.has("results") ){
        try {
            JSONArray array = result.getJSONArray("results");
            if( array.length() > 0 ){
                JSONObject place = array.getJSONObject(0);
                JSONArray components = place.getJSONArray("address_components");
                for( int i = 0 ; i < components.length() ; i++ ){
                    JSONObject component = components.getJSONObject(i);
                    JSONArray types = component.getJSONArray("types");
                    for( int j = 0 ; j < types.length() ; j ++ ){
                        if( types.getString(j).equals("locality") ){
                            return component.getString("long_name");
                        }
                    }
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    return null;
}
于 2014-09-22T12:11:43.793 回答