Kotlin Android集成Google Places自动补全时触发空指针异常
解决Google Places Autocomplete的Kotlin空指针问题
嘿,我帮你分析下这个空指针问题的根源,以及怎么修复它!
你遇到的kotlin.KotlinNullPointerException是因为place.latLng本身就是null,而你用!!强制非空导致的。问题出在两个核心环节:
1. 没有在Autocomplete请求中指定获取经纬度字段
Google Places Autocomplete不会默认返回所有Place字段,你必须在启动Intent的时候明确声明需要Place.Field.LAT_LNG,否则place.latLng就会是null。
先检查你启动Autocomplete的代码,确保它包含了LatLng字段,比如:
// 必须明确指定需要的字段,包括LAT_LNG val requiredFields = listOf(Place.Field.ID, Place.Field.NAME, Place.Field.LAT_LNG) val autocompleteIntent = Autocomplete.IntentBuilder( AutocompleteActivityMode.OVERLAY, // 根据你的需求选合适的模式 requiredFields ).build(this) startActivityForResult(autocompleteIntent, AUTOCOMPLETE_REQUEST_CODE)
这一步是关键,没有声明的话,无论怎么判断place是否非空,latLng都拿不到有效数值。
2. 避免用!!强制非空,改用安全的空处理逻辑
即使你指定了字段,也可能存在某些特殊地点没有精确经纬度的情况(比如大范围的行政区域),所以永远不要用!!来强制非空,改用安全调用和空处理:
修改你的onActivityResult里的逻辑:
if (PLACE_PICKING_MODE == 1) { place?.latLng?.let { selectedLatLng -> fromLocation = selectedLatLng val theIcon = R.drawable.gps_default placeMarkerOnMap(fromLocation, theIcon) map.animateCamera(CameraUpdateFactory.newLatLngZoom(fromLocation, 17f)) } ?: run { // 处理没有获取到经纬度的情况,比如给用户提示 Toast.makeText(this, "无法获取该地点的精确位置", Toast.LENGTH_SHORT).show() } } else if (PLACE_PICKING_MODE == 2) { place?.latLng?.let { selectedLatLng -> toLocation = selectedLatLng val theIcon = R.drawable.gps_default placeMarkerOnMap(toLocation, theIcon) map.animateCamera(CameraUpdateFactory.newLatLngZoom(toLocation, 17f)) } ?: run { Toast.makeText(this, "无法获取该地点的精确位置", Toast.LENGTH_SHORT).show() } }
这样一来,只有当place和place.latLng都不为null的时候,才会执行标记地图和移动相机的逻辑;如果latLng为空,会触发友好提示,避免空指针崩溃。
额外检查点
- 确保你的
map对象已经初始化完成,不会在执行animateCamera的时候为空 - 确认你的Google Places API密钥已经正确配置,并且在Google Cloud控制台启用了Places API服务
内容的提问来源于stack exchange,提问作者Ahmed Wagdi
相关产品推荐
相关产品推荐

