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

Android集成reCaptcha触发onClick无日志输出问题排查

问题场景

尝试获取reCaptcha验证码发送至Firebase服务器,参考官方开发文档在Activity中实现Executor接口,在onClick点击回调中编写如下代码:

override fun onClick(view: View?) {
        SafetyNet.getClient(this).verifyWithRecaptcha("Here i write my API Key")
            .addOnSuccessListener(this as Executor, OnSuccessListener { response ->
                val userResponseToken = response.tokenResult
                Log.d("TAG", userResponseToken.toString())
            })
            .addOnFailureListener(this as Executor, OnFailureListener { e ->
                if (e is ApiException) {
                    Log.d("TAG", "Error: ${CommonStatusCodes.getStatusCodeString(e.statusCode)}")
                } else {
                    Log.d("TAG", "Error: ${e.message}")
            })

点击按钮可正常触发onClick方法,但控制台无任何相关日志打印,代码存在以下两处核心错误:


1. 语法结构缺失,括号未闭合

代码存在明显的语法错误,少了3个关键的闭合大括号:

  • else分支的代码块没有闭合}
  • OnFailureListener的lambda闭包没有闭合}
  • addOnFailureListener方法调用、onClick方法本身也缺少对应的闭合括号
    这类语法错误正常会直接导致编译失败,如果你通过其他方式绕过编译检查运行,回调逻辑根本没有被正确注册,自然不会触发日志打印。
    补全括号后的基础代码结构应该是:
override fun onClick(view: View?) {
        SafetyNet.getClient(this).verifyWithRecaptcha("Here i write my API Key")
            .addOnSuccessListener(this as Executor, OnSuccessListener { response ->
                val userResponseToken = response.tokenResult
                Log.d("TAG", userResponseToken.toString())
            })
            .addOnFailureListener(this as Executor, OnFailureListener { e ->
                if (e is ApiException) {
                    Log.d("TAG", "Error: ${CommonStatusCodes.getStatusCodeString(e.statusCode)}")
                } else {
                    Log.d("TAG", "Error: ${e.message}")
                } // 补else闭合
            }) // 补OnFailureListener闭合、方法调用闭合
} // 补onClick方法闭合

2. Executor接口实现错误,回调无法执行

你把Activity强转为Executor传入监听器,但是大概率没有正确重写Executor的execute(Runnable)方法。
监听器的回调逻辑会被封装成Runnable任务,交给你传入的Executor调度执行:如果你重写execute方法时是空实现,或者没有把Runnable投递到可运行的线程队列,回调任务永远不会被执行,自然不会打印日志。
正确的Activity实现Executor的写法如下,把回调任务投递到主线程执行即可:

class YourActivity : AppCompatActivity(), Executor {
    // 其他业务代码省略

    override fun execute(command: Runnable) {
        // 将待执行的回调任务post到主线程
        Handler(Looper.getMainLooper()).post(command)
    }
}

额外排查项

修正上述问题后如果仍无日志,检查两个配置项:

  • 填入的API Key必须是reCaptcha安卓平台类型密钥,不能使用网页端、服务端密钥
  • 确认AndroidManifest中已经声明网络权限:<uses-permission android:name="android.permission.INTERNET" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:16:07