为什么Android Geocoder会抛出“服务不可用”例外?

时间:2011-01-21 16:17:11

标签: android google-geocoder

该应用使用Geocoder对象。它在我的股票Froyo Nexus One上运行良好。但后来我在不同的设备上运行完全相同的应用程序(Advent Vega 10“平板电脑也运行Froyo),我得到了这个例外:服务不可用。我正在使用的方法是{{1我正在构建Android 1.6 Google API。

我知道在模拟器上抛出此异常的问题,但我怀疑这是不同的。为什么会在运行Froyo的设备上抛出它而不是另一台设备?

该应用是一款定位应用,由于平板电脑没有GPS或移动网络,因此在Wi-Fi连接未提供位置的情况下,用户必须手动指定,因此无法使用Geocoder对象是坏消息。

我可以为用户添加一种在地图上选择位置的方法,但这并不理想。可能我可以直接使用谷歌地图API,但我希望首先了解问题的本质,因为有一个更简单的解决方案会很好。

希望在未来版本中,Android将包含非Geocoder设备的操作系统级“默认位置”,因此位置感知应用可在Google TV等设备上开箱即用。

6 个答案:

答案 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;
}