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
相关产品推荐
相关产品推荐

