反向地理编码停止在android地图版本v1中工作

时间:2013-02-28 07:30:08

标签: android google-maps reverse-geocoding

我在Android中使用反向地理编码。我的代码成功运行到昨天,但现在它停止在我的Android设备(三星S2)上工作。但它适用于模拟器。当我在设备上编译时,它在logcat中显示以下错误:

02-28 12:56:22.800: W/System.err(9048): java.io.IOException: Service not Available
02-28 12:56:22.815: W/System.err(9048):     at android.location.Geocoder.getFromLocation(Geocoder.java:136)
02-28 12:56:22.815: W/System.err(9048):     at in.wptrafficanalyzer.locationreversegeocoding.MainActivity$ReverseGeocodingTask.doInBackground(MainActivity.java:154)
02-28 12:56:22.830: W/System.err(9048):     at in.wptrafficanalyzer.locationreversegeocoding.MainActivity$ReverseGeocodingTask.doInBackground(MainActivity.java:1)
02-28 12:56:22.830: W/System.err(9048):     at android.os.AsyncTask$2.call(AsyncTask.java:264)
02-28 12:56:22.830: W/System.err(9048):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-28 12:56:22.835: W/System.err(9048):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-28 12:56:22.835: W/System.err(9048):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
02-28 12:56:22.835: W/System.err(9048):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-28 12:56:22.845: W/System.err(9048):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-28 12:56:22.845: W/System.err(9048):     at java.lang.Thread.run(Thread.java:856)

3 个答案:

答案 0 :(得分:3)

这是一个已知问题。可能的解决方法是您必须重新启动设备。我被告知我再次工作。

答案 1 :(得分:3)

这是由多种原因造成的。我有一些设备总能做到这一点,而相同的代码在其他设备上运行良好。

一个很好的解决方法是捕获IOException并启动google maps web api;

public static JSONObject getLocationInfo(String address) {

    HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?address="
            + address + "&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;
}

您可以像这样提取的返回值;

        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");

答案 2 :(得分:1)

现在正在使用...........使用这个技巧。

只需编辑project.properties

即可
# Project target
target=Google Inc.:Google APIs:16

原因是Geocoder类存在于核心Android框架中,但依赖于Google API提供的代码才能正常运行。即使您的AVD包含Google API,您的项目仍需要针对特定​​的构建目标进行构建。