54

我正在尝试根据 long/lat 获取地址。似乎这样的事情应该有效?

Geocoder myLocation = Geocoder(Locale.getDefault());
    List myList = myLocation.getFromLocation(latPoint,lngPoint,1);

问题是我不断收到: 对于 savemaplocation 类型的方法 Geocoder(Locale) 未定义

任何帮助都会有所帮助。谢谢你。


谢谢,我尝试了上下文,首先尝试了语言环境,但失败了,正在查看其他一些构造函数(我见过一个只提到语言环境的构造函数)。不管,

它没有用,因为我仍然得到:方法 Geocoder(Context, Locale) 未定义类型 savemaplocation

我确实有:导入 android.location.Geocoder;

4

7 回答 7

71

下面的代码片段是为我做的(lat 和 lng 是在这个位之上声明的双精度):

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
于 2009-01-25T00:58:21.620 回答
50

这是一个完整的示例代码,使用 Thread 和 Handler 在不阻塞 UI 的情况下获取 Geocoder 答案。

Geocoder 调用过程,可以位于一个 Helper 类中

public static void getAddressFromLocation(
        final Location location, final Context context, final Handler handler) {
    Thread thread = new Thread() {
        @Override public void run() {
            Geocoder geocoder = new Geocoder(context, Locale.getDefault());   
            String result = null;
            try {
                List<Address> list = geocoder.getFromLocation(
                        location.getLatitude(), location.getLongitude(), 1);
                if (list != null && list.size() > 0) {
                    Address address = list.get(0);
                    // sending back first address line and locality
                    result = address.getAddressLine(0) + ", " + address.getLocality();
                }
            } catch (IOException e) {
                Log.e(TAG, "Impossible to connect to Geocoder", e);
            } finally {
                Message msg = Message.obtain();
                msg.setTarget(handler);
                if (result != null) {
                    msg.what = 1;
                    Bundle bundle = new Bundle();
                    bundle.putString("address", result);
                    msg.setData(bundle);
                } else 
                    msg.what = 0;
                msg.sendToTarget();
            }
        }
    };
    thread.start();
}

以下是您的 UI Activity 中对此 Geocoder 过程的调用:

getAddressFromLocation(mLastKownLocation, this, new GeocoderHandler());

以及在您的 UI 中显示结果的处理程序:

private class GeocoderHandler extends Handler {
    @Override
    public void handleMessage(Message message) {
        String result;
        switch (message.what) {
        case 1:
            Bundle bundle = message.getData();
            result = bundle.getString("address");
            break;
        default:
            result = null;
        }
        // replace by what you need to do
        myLabel.setText(result);
    }   
}

不要忘记将以下权限放入您的Manifest.xml

<uses-permission android:name="android.permission.INTERNET" />
于 2011-02-12T22:35:04.507 回答
37

看起来这里发生了两件事。

1)您new在调用构造函数之前错过了关键字。

2)您传递给 Geocoder 构造函数的参数不正确。您正在传递 aLocale它期望 a 的地方Context

有两个Geocoder构造函数,它们都需要 a Context,一个也需要 a Locale

Geocoder(Context context, Locale locale)
Geocoder(Context context)

解决方案

修改您的代码以传入有效的 Context 并包含new,您应该一切顺利。

Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
List<Address> myList = myLocation.getFromLocation(latPoint, lngPoint, 1);

笔记

如果您仍然遇到问题,则可能是权限问题。地理编码隐式使用 Internet 来执行查找,因此您的应用程序将需要INTERNET清单中的 uses-permission 标签。

manifest在清单的节点中添加以下 uses-permission 节点。

<uses-permission android:name="android.permission.INTERNET" />
于 2009-01-23T10:25:25.110 回答
8

原因是不存在后端服务:

Geocoder 类需要一个不包含在核心 android 框架中的后端服务。如果平台中没有后端服务,Geocoder 查询方法将返回一个空列表。

于 2013-10-07T07:40:28.790 回答
5

首先使用 Location 和 LocationManager 类获取纬度和经度。现在尝试下面的代码获取城市,地址信息

double latitude = location.getLatitude();
double longitude = location.getLongitude();
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
    List<Address> addresses = gc.getFromLocation(lat, lng, 1);
    StringBuilder sb = new StringBuilder();
    if (addresses.size() > 0) {
        Address address = addresses.get(0);
        for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
            sb.append(address.getAddressLine(i)).append("\n");
            sb.append(address.getLocality()).append("\n");
            sb.append(address.getPostalCode()).append("\n");
            sb.append(address.getCountryName());
    }

城市信息现在在某人。现在将 sb 转换为 String(使用 sb.toString() )。

于 2012-06-01T12:41:06.270 回答
2

好吧,我仍然很难过。所以这里有更多代码。

在我离开我的地图之前,我调用SaveLocation(myMapView,myMapController);了这最终调用了我的地理编码信息。

但是由于getFromLocation可以抛出一个IOException,我不得不执行以下操作来调用 SaveLocation

try
{
    SaveLocation(myMapView,myMapController);
}
catch (IOException e) 
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

然后我必须通过说它抛出 IOExceptions 来更改 SaveLocation :

 public void SaveLocation(MapView mv, MapController mc) throws IOException{
    //I do this : 
    Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
    List myList = myLocation.getFromLocation(latPoint, lngPoint, 1);
//...
    }

而且每次都会崩溃。

于 2009-01-23T23:06:51.580 回答
0

用这个

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
于 2016-11-07T13:36:00.067 回答