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

Android Studio集成Google Maps显示附近医院功能失效求助

问题诊断与修复方案

核心问题分析与修复

1. 搜索半径超出API限制

你的PROXIMITY_RADIUS设置为100000000(10万公里),而Google Places Nearby Search API的最大允许半径是50000米(50公里),超过这个值会返回空结果或错误响应。

修复:

// 修改为合理范围,比如5公里(5000米)
int PROXIMITY_RADIUS = 5000;

2. 未处理getLastLocation返回null的情况

fusedLocationProviderClient.getLastLocation()可能因为设备未定位过、位置服务关闭等原因返回null,直接调用location.getLatitude()会导致崩溃,同时跳过医院加载逻辑。另外,当前代码未将地图相机移动到用户位置,导致默认显示世界地图。

修复:

fusedLocationProviderClient.getLastLocation().addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
    @Override
    public void onSuccess(Location location) {
        if (location != null) {
            ShowHospitals(location.getLatitude(), location.getLongitude());
            // 将地图相机移动到当前位置,缩放级别15适合查看周边地点
            LatLng currentLatLng = new LatLng(location.getLatitude(), location.getLongitude());
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 15));
        } else {
            Toast.makeText(getActivity(), "无法获取当前位置,请检查位置服务", Toast.LENGTH_SHORT).show();
        }
    }
});

3. 权限请求后的逻辑错误

onRequestPermissionsResult中的条件判断写反了,导致权限授予后无法正确初始化地图和GoogleApiClient。

修复:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case Permission_Request:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限已授予,初始化地图和客户端
                if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                    if (client == null) {
                        buildGoogleApiClient();
                    }
                    mMap.setMyLocationEnabled(true);
                    mMap.setTrafficEnabled(true);
                }
            } else {
                Toast.makeText(getActivity(), "Permission Denied", Toast.LENGTH_LONG).show();
            }
            break;
    }
}

4. 未注册位置更新监听

onConnected方法中创建了locationRequest但没有调用requestLocationUpdates,导致onLocationChanged不会触发,无法实时更新位置和医院信息。

修复:
在onConnected方法末尾添加:

if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    LocationServices.FusedLocationApi.requestLocationUpdates(client, locationRequest, this);
}

5. 废弃的sensor参数

Google Places API的sensor参数已被废弃,保留该参数可能导致请求被拒绝,需要从URL中移除。

修复:
修改getUrl方法:

private String getUrl(double latitude, double longitude, String nearbyPlace) {
    StringBuilder googlePlaceUrl = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?");
    googlePlaceUrl.append("location=").append(latitude).append(",").append(longitude);
    googlePlaceUrl.append("&radius=").append(PROXIMITY_RADIUS);
    googlePlaceUrl.append("&type=").append(nearbyPlace);
    googlePlaceUrl.append("&key=" + "AIzaSyAmeQ8IwQWBcmFLRpKARu7LM1TlShQKmfg");
    Log.d("NearbyHospitalActivity", "url = " + googlePlaceUrl.toString());
    return googlePlaceUrl.toString();
}

6. 检查GetNearbyPlacesData的实现

确保GetNearbyPlacesData这个AsyncTask正确完成以下逻辑:

  • 发起网络请求获取医院数据
  • 解析JSON响应中的地点信息(提取名称、经纬度等)
  • 在onPostExecute中调用mMap.addMarker()添加医院标记
  • 处理网络请求异常(比如无网络、API密钥无效等)

如果该类存在解析错误或未添加标记的逻辑,也会导致地图上无医院显示。

额外优化建议

  • 在onStop中移除位置更新监听,避免资源浪费:
@Override
public void onStop() {
    super.onStop();
    if (client != null && client.isConnected()) {
        LocationServices.FusedLocationApi.removeLocationUpdates(client, this);
        client.disconnect();
    }
}
  • 确保你的Google API密钥已启用Places API和Maps SDK for Android,并且正确配置了API限制(包名、SHA-1指纹)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:04:59