我在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)
答案 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,您的项目仍需要针对特定的构建目标进行构建。