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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:16:52