geocoder.getFromLocationName仅返回null

时间:2010-12-31 00:04:13

标签: android google-geocoder illegalargumentexception

过去两天我在脑海中忘记了我在Android代码中收到IllegalArgumentException错误时尝试从地址中获取坐标,甚至反转,从经度和纬度获取地址。这是代码,但我看不到错误。这是一个标准的代码段,可以在Google搜索中轻松找到。

public GeoPoint determineLatLngFromAddress(Context appContext, String strAddress) {
    Geocoder geocoder = new Geocoder(appContext, Locale.getDefault());
    GeoPoint g = null; 
    try {
        System.out.println("str addres: " + strAddress);
        List<Address> addresses = geocoder.getFromLocationName(strAddress, 5);
        if (addresses.size() > 0) {
            g = new GeoPoint(
               (int) (addresses.get(0).getLatitude() * 1E6),
               (int) (addresses.get(0).getLongitude() * 1E6)
            );
        }
    } catch (Exception e) {
        throw new IllegalArgumentException("locationName == null");
    }
    return g;
 }

这些是manifest.xml文件的权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

我也确实声明了Google API密钥:<uses-library android:name="com.google.android.maps" />

从上面的代码段开始,geocoder不是nulladdressappContext也不是,我在这里偶然发现:geocoder.getFromLocationName(strAddress, 5);

我做了很多谷歌搜索,发现没有任何效果,我找到的最重要的信息是:

  

Geocoder类需要一个未包含在核心android框架中的后端服务。

Sooo,我现在很困惑。我需要在代码中调用,导入,添加,使用...以使其工作? 我使用的是Google API 2.2,API级别8。 如果有人为此找到了解决方案,或者是文档指针,我没有发现,请告诉我们。

4 个答案:

答案 0 :(得分:13)

我遇到了类似的问题,发现轮询Geocoder直到我得到了结果。我是这样做的,到目前为止效果很好。

try {
    List<Address> geoResults = geocoder.getFromLocationName("<address goes here>", 1);
    while (geoResults.size()==0) {
        geoResults = geocoder.getFromLocationName("<address goes here>", 1);
    }
    if (geoResults.size()>0) {
        Address addr = geoResults.get(0);
        myLocation.setLatitude(addr.getLatitude());
        myLocation.setLongitude(addr.getLongitude());
    }
} catch (Exception e) {
    System.out.print(e.getMessage());
}

答案 1 :(得分:2)

public LatLng determineLatLngFromAddress(Context appContext, String strAddress) {
        LatLng latLng = null;
        Geocoder geocoder = new Geocoder(appContext, Locale.getDefault());
        List<Address> geoResults = null;

        try {
            geoResults = geocoder.getFromLocationName(strAddress, 1);
            while (geoResults.size()==0) {
                geoResults = geocoder.getFromLocationName(strAddress, 1);
            }
            if (geoResults.size()>0) {
                Address addr = geoResults.get(0);
                latLng = new LatLng(addr.getLatitude(),addr.getLongitude());
            }
        } catch (Exception e) {
            System.out.print(e.getMessage());
        }

    return latLng; //LatLng value of address
    }

答案 2 :(得分:2)

有同样的问题。池化不起作用所以我用它来获取位置:Geocoding Responses

使用此类获取位置的JSONObject:

String link = "https://maps.googleapis.com/maps/api/geocode/json?address=" + addressString + "&key={YOUR_API_KEY}";

GetLocationDownloadTask getLocation = new GetLocationDownloadTask();

getLocation.execute(link);

您可以像这样创建和运行类实例:

<testsuite name="unit">
            <directory>Tests/*</directory>        
</testsuite>

答案 3 :(得分:0)

在Android 2.0上运行您的代码,它会起作用。我和may代码有同样的问题。它不适用于2.2,不知道为什么