该应用使用Geocoder对象。它在我的股票Froyo Nexus One上运行良好。但后来我在不同的设备上运行完全相同的应用程序(Advent Vega 10“平板电脑也运行Froyo),我得到了这个例外:服务不可用。我正在使用的方法是{{1我正在构建Android 1.6 Google API。
我知道在模拟器上抛出此异常的问题,但我怀疑这是不同的。为什么会在运行Froyo的设备上抛出它而不是另一台设备?
该应用是一款定位应用,由于平板电脑没有GPS或移动网络,因此在Wi-Fi连接未提供位置的情况下,用户必须手动指定,因此无法使用Geocoder对象是坏消息。
我可以为用户添加一种在地图上选择位置的方法,但这并不理想。可能我可以直接使用谷歌地图API,但我希望首先了解问题的本质,因为有一个更简单的解决方案会很好。
希望在未来版本中,Android将包含非Geocoder设备的操作系统级“默认位置”,因此位置感知应用可在Google TV等设备上开箱即用。
答案 0 :(得分:27)
我问谷歌的Reto Meier确认我的理论是正确的,他说“正确。地理编码器是Google API插件的一部分,不属于AOSP。”
因此任何不附带Play商店,GMail应用程序等的设备也将缺少Geocoder后端。
答案 1 :(得分:12)
似乎有another possible workaround for this problem,不幸的是标记为重复的问题,因此可能会错过。从本质上讲,重启设备可以解决问题。注意我称之为“解决方法”而不是“解决方案”。 :(
答案 2 :(得分:2)
对于那些寻找替代方案的人,希望我在另一篇文章中的答案很有用。 在地理编码中发现错误时,您可以使用Google Geocoding API。
更多代码=> Get current location using json
答案 3 :(得分:1)
有些设备没有Geocoder支持,所以您需要创建自己的地理编码器。
基本上你需要创建一个异步任务来请求google获取地址并处理json响应。
使用aquery,我做这样的事情:
public void asyncJson(String address){
address = address.replace(" ", "+");
String url = "http://maps.googleapis.com/maps/api/geocode/json?address="+ address +"&sensor=true";
aq.ajax(url, JSONObject.class, new AjaxCallback<JSONObject>() {
@Override
public void callback(String url, JSONObject json, AjaxStatus status) {
if(json != null){
//here you work with the response json
JSONArray results = json.getJSONArray("results");
Toast.makeText(context, results.getJSONObject(1).getString("formatted_address"));
}else{
//ajax error, show error code
Toast.makeText(aq.getContext(), "Error:" + status.getCode(), Toast.LENGTH_LONG).show();
}
}
});
}
答案 4 :(得分:1)
浪费了几个小时后,我得到了一个最简单的解决方案。
我刚刚重启了我的设备,它开始工作了。
看来,问题是由于某些操作系统级别的缓存问题。希望它也适用于你的..
答案 5 :(得分:0)
我有同样的问题。我使用了以下功能。
使用您的活动
context
并且不要将getApplicationContext()
用于以下功能
public static Address getLocalityFrmGeoCoder(Context context, Location mLocation) {
try {
if(mLocation!=null){
Geocoder gCoder = new Geocoder(context, Locale.getDefault());
List<Address> address = gCoder.getFromLocation(mLocation.getLatitude(), mLocation.getLongitude(), 1);
if (address.size() > 0) {
return address.get(0);
}
}
} catch (Exception e) {
Log.d("GEOCODER", "GEOCODER EXCEPTION");
e.printStackTrace();
}
return null;
}