Google Places API未捕获运行时异常求助(配置无误)
解决Google Places API偶发未捕获运行时异常的思路
我完全懂这种偶尔抽风的问题有多闹心——明明配置都对、大部分时间正常,突然蹦出来的异常真的让人头大。结合你描述的情况和代码片段,咱们可以从这几个方向排查和修复:
给任务添加失败监听,捕获异常
你的代码目前只处理了任务成功的情况,但getCurrentPlace调用可能因为网络波动、API配额耗尽、临时权限问题等失败,这时候未处理的异常就会直接抛出来。建议补上addOnFailureListener来兜底:private fun performPlaceDetection() { try { val placeResult = placeDetectionClient.getCurrentPlace(null) placeResult.addOnCompleteListener({ task -> if (task.isSuccessful) { val likelyPlaces = task.result for (placeLikelihood in likelyPlaces) { // 你的业务逻辑 } } else { // 处理任务成功但结果异常的情况 Log.e("PlaceDetection", "任务执行异常: ${task.exception?.message}") } }).addOnFailureListener { exception -> // 捕获API调用失败的异常 Log.e("PlaceDetection", "获取位置失败: ${exception.message}") // 这里可以给用户弹出提示,比如"暂时无法获取位置,请稍后重试" } } catch (e: Exception) { // 捕获try块内可能抛出的其他异常 Log.e("PlaceDetection", "执行过程异常: ${e.message}") } }提前检查权限的有效性
即使你在Manifest里声明了权限,用户也可能在应用运行时临时关闭位置权限,导致API调用失败。在调用getCurrentPlace之前,务必先检查权限状态:private fun performPlaceDetection() { val permission = Manifest.permission.ACCESS_FINE_LOCATION if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { // 权限未授予,先请求权限 ActivityCompat.requestPermissions(this, arrayOf(permission), REQUEST_LOCATION_PERMISSION) return } // 权限正常,继续执行API调用 try { // 你的原有代码 } catch (e: Exception) { // 异常处理 } }验证API密钥的配置细节
虽然你说已经启用了API,但偶尔的异常可能和密钥的应用限制有关:- 检查Google Cloud控制台中API密钥的应用限制,确认包名、SHA-1指纹和你的应用完全匹配;
- 查看API的使用配额,是否出现了临时配额耗尽的情况;
- 查看控制台的错误日志,有没有权限拒绝、密钥无效之类的具体报错信息。
避免空指针异常
万一task.result返回空,遍历likelyPlaces时会抛出空指针异常,建议先做非空判断:val likelyPlaces = task.result ?: run { Log.w("PlaceDetection", "未获取到任何位置信息") return@addOnCompleteListener } for (placeLikelihood in likelyPlaces) { // 你的业务逻辑 }
这些调整应该能帮你捕获到之前未处理的异常,也能覆盖大部分偶发的API调用失败场景。如果之后能拿到具体的异常日志,会更方便进一步定位问题。
内容的提问来源于stack exchange,提问作者kip2
相关产品推荐
相关产品推荐

