You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Android中如何通过经纬度(lat, lon)获取Place ID

解决Geocoder无法获取Place ID的问题

你遇到的问题很常见:Android自带的Geocoder类确实没有提供获取Google Maps Place ID的方法,它的Address对象里根本不存在getPlaceID()这个接口——这是因为Geocoder依赖的是设备系统底层的地理编码服务,和Google Maps的官方API不是一套体系,自然拿不到Place ID。

下面给你两种靠谱的解决方案,都是官方支持的方式:

方案1:调用Google Maps Geocoding API(REST接口)

这是最直接的方式,通过HTTP请求获取经纬度对应的Place ID,步骤如下:

  1. 先在Google Cloud Console启用Geocoding API,并确保你的API密钥有调用权限(记得配置Android应用限制,避免密钥被盗用)。
  2. 发送GET请求到Geocoding API的接口,传入经纬度和你的API密钥,然后解析返回的JSON数据拿到place_id

代码示例(用OkHttp实现)

首先添加OkHttp依赖到你的build.gradle

implementation 'com.squareup.okhttp3:okhttp:4.11.0'

然后编写请求代码:

// 注意:网络请求必须在子线程执行,不能在主线程
new Thread(() -> {
    OkHttpClient client = new OkHttpClient();
    String lat = "52.2641";
    String lon = "76.9597";
    String apiKey = "YOUR_GOOGLE_API_KEY"; // 替换成你的API密钥
    
    String url = String.format("https://maps.googleapis.com/maps/api/geocode/json?latlng=%s,%s&key=%s", lat, lon, apiKey);
    Request request = new Request.Builder().url(url).build();

    try {
        Response response = client.newCall(request).execute();
        if (response.isSuccessful() && response.body() != null) {
            String json = response.body().string();
            JSONObject jsonObject = new JSONObject(json);
            JSONArray results = jsonObject.getJSONArray("results");
            
            if (results.length() > 0) {
                String placeId = results.getJSONObject(0).getString("place_id");
                // 回到主线程显示Toast
                runOnUiThread(() -> {
                    Toast.makeText(this, placeId, Toast.LENGTH_SHORT).show();
                });
            }
        }
    } catch (IOException | JSONException e) {
        e.printStackTrace();
    }
}).start();

方案2:使用Google Places SDK for Android(推荐)

如果你的项目本身就依赖Google Maps相关服务,更推荐用官方的Places SDK,集成更优雅,也不需要自己处理JSON解析:

  1. 先在Google Cloud Console启用Places API,并配置好API密钥。
  2. 添加Places SDK依赖到build.gradle
implementation 'com.google.android.libraries.places:places:3.4.0' // 可以用最新版本
  1. 初始化Places客户端并发起反向地理编码请求:
// 在Activity的onCreate里初始化Places
Places.initialize(getApplicationContext(), "YOUR_GOOGLE_API_KEY");
PlacesClient placesClient = Places.createClient(this);

// 构造反向地理编码请求
LatLng targetLatLng = new LatLng(52.2641, 76.9597);
ReverseGeocodingRequest request = ReverseGeocodingRequest.builder(targetLatLng).build();

// 发起请求并处理结果
placesClient.findReverseGeocode(request)
        .addOnSuccessListener(response -> {
            if (!response.getGeocodeAddresses().isEmpty()) {
                GeocodeAddress geocodeAddress = response.getGeocodeAddresses().get(0);
                String placeId = geocodeAddress.getPlaceId();
                Toast.makeText(this, placeId, Toast.LENGTH_SHORT).show();
            }
        })
        .addOnFailureListener(e -> {
            // 处理请求失败的情况
            e.printStackTrace();
        });

注意事项

  • 两种方案都需要确保你的API密钥已经启用了对应的API(Geocoding API或Places API),并且配置了正确的应用限制(比如Android应用的SHA-1和包名),否则会返回权限错误。
  • Geocoder虽然使用简单,但依赖设备系统服务,部分设备可能无法正常工作,而且返回的信息远不如Google官方API全面,所以如果需要Place ID这类Google Maps专属数据,建议直接用上面两种方案。

内容的提问来源于stack exchange,提问作者Shyngys Rakhad

火山引擎 最新活动