1

我正在使用 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)
4

3 回答 3

3

这是一个已知的问题。一种可能的解决方法是您必须重新启动设备。有人告诉我,我又工作了。

于 2013-02-28T07:34:12.207 回答
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");
于 2013-02-28T07:41:26.813 回答
1

它现在正在工作............使用这个技巧。

只需编辑 project.properties

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

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

于 2013-03-01T08:37:44.340 回答