You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Studio MapsActivity Marker中从经纬度获取并显示完整地址?

实现Marker显示完整地址的方案

嘿,我来帮你把Marker上的经纬度换成完整地址!核心思路是用Android的Geocoder类做逆地理编码——把经纬度转换成对应的实际地址,下面是具体步骤和代码:

1. 先确认权限配置

如果还没加,记得在AndroidManifest.xml里添加上必要的权限(Geocoder可能需要联网获取地址数据):

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

2. 修改MapsActivity中的Marker代码

替换原来设置Marker标题的逻辑,换成通过Geocoder获取地址的代码:

LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

// 核心:通过经纬度获取完整地址
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
try {
    // 获取地址列表,取第一个最精确的结果
    List<Address> addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
    if (addresses != null && !addresses.isEmpty()) {
        Address address = addresses.get(0);
        // 拼接完整地址,你可以根据需求调整显示字段
        StringBuilder fullAddress = new StringBuilder();
        for (int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
            fullAddress.append(address.getAddressLine(i)).append("\n");
        }
        // 把拼接好的地址设为Marker标题
        markerOptions.title(fullAddress.toString().trim());
    } else {
        // 没获取到地址时, fallback到显示经纬度
        markerOptions.title(String.valueOf(latLng));
    }
} catch (IOException e) {
    e.printStackTrace();
    // 网络异常或Geocoder不可用时,显示经纬度兜底
    markerOptions.title(String.valueOf(latLng));
}

currentLocationMarker = mMap.addMarker(markerOptions);
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

3. 重要注意事项

  • 避免主线程ANR:getFromLocation()方法可能耗时(比如网络请求),直接在主线程调用容易导致应用无响应。建议用异步任务处理,比如用AsyncTask:
    private class GetAddressTask extends AsyncTask<LatLng, Void, String> {
        @Override
        protected String doInBackground(LatLng... latLngs) {
            LatLng latLng = latLngs[0];
            Geocoder geocoder = new Geocoder(MapsActivity.this, Locale.getDefault());
            try {
                List<Address> addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
                if (addresses != null && !addresses.isEmpty()) {
                    Address address = addresses.get(0);
                    StringBuilder fullAddress = new StringBuilder();
                    for (int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
                        fullAddress.append(address.getAddressLine(i)).append("\n");
                    }
                    return fullAddress.toString().trim();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return String.valueOf(latLng);
        }
    
        @Override
        protected void onPostExecute(String address) {
            // 异步获取到地址后,更新Marker标题
            if (currentLocationMarker != null) {
                currentLocationMarker.setTitle(address);
            }
        }
    }
    
    调用方式:先添加Marker,再启动异步任务更新标题
    currentLocationMarker = mMap.addMarker(markerOptions);
    new GetAddressTask().execute(latLng);
    
  • 兼容性兜底:部分设备或地区可能不支持Geocoder,所以一定要保留异常捕获和 fallback 逻辑(回到显示经纬度)。
  • 自定义地址显示:如果不需要完整地址,也可以直接调用address.getLocality()(城市)、address.getThoroughfare()(街道)等方法拼接你需要的内容。

这样修改后,Marker的标题就会显示对应的完整地址啦!

内容的提问来源于stack exchange,提问作者Tanner Tattini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:25:27