En esta página se explica cómo integrar reCAPTCHA en una aplicación Android.
El SDK usa la reflexión y el código dinámico para permitir la modificación y la optimización del sistema de detección en las aplicaciones o los SDKs desplegados. El conjunto de clases disponibles en el sistema se limita a una lista controlada para evitar interferencias con la aplicación.
Antes de empezar
Crea una clave de reCAPTCHA para la plataforma de aplicaciones Android.
También puede copiar el ID de una clave de reCAPTCHA para Android siguiendo uno de estos pasos:
Para copiar el ID de una clave ya creada desde la consola deGoogle Cloud , sigue estos pasos:
Ve a la página reCAPTCHA.
- En la lista de claves de reCAPTCHA, coloca el puntero sobre la clave que quieras copiar y, a continuación, haz clic en .
- Para copiar el ID de una clave que ya tengas mediante la API REST, usa el método projects.keys.list.
- Para copiar el ID de una clave que ya tengas con gcloud CLI, usa el comando gcloud recaptcha keys list.
Preparar el entorno Android
Nativo de Android
Prepara tu entorno de desarrollo descargando e instalando la última versión de Android Studio.
Asegúrate de que tu aplicación tenga el valor mínimo del SDK de Android definido como API 23: Android 6.0 (Marshmallow).
Si vas a crear una aplicación móvil, crea una aplicación de prueba iniciando un nuevo proyecto de Android Studio:
- Selecciona Vaciar actividad. Si quieres usar Jetpack Compose en tu aplicación, elige Empty Compose Activity (Actividad de Compose vacía).
- Define el idioma como kotlin.
- Define el valor mínimo del SDK en API 23: Android 6.0 (Marshmallow).
Comprueba que el repositorio Maven de Google
google()
esté en la lista de repositorios del archivobuild.gradle
a nivel de proyecto, tal como se muestra en el siguiente fragmento:allprojects { repositories { google() } }
Para obtener más información, consulta el repositorio de Maven de Google.
Para añadir la dependencia de la API reCAPTCHA, añade la siguiente regla de compilación a la sección
dependencies
del archivobuild.gradle
a nivel de la aplicación.implementation 'com.google.android.recaptcha:recaptcha:18.8.0-beta03'
Para obtener más información sobre cómo añadir dependencias en aplicaciones Android, consulta Añadir dependencias de compilación.
Añade el permiso de Internet entre la primera etiqueta
<manifest>
y la primera etiqueta<application>
del manifiesto de tu aplicación (por ejemplo,AndroidManifest.xml
). Este permiso es obligatorio porque la API de reCAPTCHA implica operaciones de red.<manifest ...> <uses-permission android:name="android.permission.INTERNET" /> <application ...> ... </application> </manifest>
Si quieres usar las bibliotecas
AndroidX
en tu nuevo proyecto, compila el SDK para Android 9.0 o una versión posterior y añade el siguiente fragmento de código agradle.properties
.android.useAndroidX=true android.enableJetifier=true
Para obtener más información, consulta Migrar a AndroidX.
Flutter
Para obtener instrucciones detalladas sobre cómo usar reCAPTCHA a través de Flutter, consulta la documentación de Flutter.
React Native
Para obtener instrucciones detalladas sobre cómo usar reCAPTCHA a través de React Native, consulta la documentación de React Native.
Integrar reCAPTCHA en una aplicación Android
Instancia un cliente usando la clave de reCAPTCHA (KEY_ID) que has creado para tu aplicación Android.
Kotlin con
fetchClient
El método
fetchClient
devuelve un cliente inmediatamente e inicia la inicialización del SDK en segundo plano. Vuelve a intentar la comunicación con el servidor de reCAPTCHA si se produce un error de red.class CustomApplication : Application() { private lateinit var recaptchaClient: RecaptchaClient // we recommend initializing in a ViewModel private val recaptchaScope = CoroutineScope(Dispatchers.IO) override fun onCreate() { super.onCreate() initializeRecaptchaClient() } private fun initializeRecaptchaClient() { recaptchaScope.launch { try { recaptchaClient = Recaptcha.fetchClient(application, "KEY_ID") } catch(e: RecaptchaException) { // Handle errors ... // See "Handle errors" section } } } }
Java con
fetchClient
public final class CustomApplication extends Application { @Nullable private RecaptchaTasksClient recaptchaTasksClient = null; @Override protected void onCreate() { super.onCreate(); initializeRecaptchaClient(); } private void initializeRecaptchaClient() { Recaptcha .fetchTaskClient(getApplication(), "KEY_ID") .addOnSuccessListener( this, new OnSuccessListener<RecaptchaTasksClient>() { @Override public void onSuccess(RecaptchaTasksClient client) { MainActivity.this.recaptchaTasksClient = client; } }) .addOnFailureListener( this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle errors ... // See "Handle errors" section } }); } }
La inicialización del SDK puede tardar varios segundos en completarse. Para reducir esta latencia, inicializa el cliente lo antes posible, por ejemplo, durante la llamada
onCreate()
de una claseApplication
personalizada. No debes hacer que los elementos de la interfaz de usuario se bloqueen en el SDK de reCAPTCHA.Por cada acción de tu aplicación que esté protegida con reCAPTCHA, llama al método
execute
y pasa un RecaptchaAction. reCAPTCHA proporciona un conjunto de acciones integradas y, si es necesario, puedes crear acciones personalizadas.En el siguiente fragmento de código se muestra cómo usar
execute
para proteger una acciónLOGIN
.Kotlin
private fun executeLoginAction() { recaptchaScope.launch { recaptchaClient .execute(RecaptchaAction.LOGIN) .onSuccess { token -> // Handle success ... // See "What's next" section for instructions // about handling tokens. } .onFailure { exception -> // Handle errors ... } } }
Java
private void executeLoginAction(View v) { assert recaptchaTasksClient != null; recaptchaTasksClient .executeTask(RecaptchaAction.LOGIN) .addOnSuccessListener( this, new OnSuccessListener<String>() { @Override public void onSuccess(String token) { // Handle success ... // See "What's next" section for instructions // about handling tokens. } }) .addOnFailureListener( this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle errors ... } }); }
Migrar del método getClient al método fetchClient
El método fetchClient
devuelve un RecaptchaClient
que vuelve a intentar la inicialización si se produce un fallo en la red. Si la aplicación no tiene acceso a la red cuando se crea el cliente, este sigue intentándolo y se inicializa correctamente cuando se adquiere una red.
Si llamas a execute(timeout)
y el cliente aún no está listo, intenta inicializar antes de devolver un token o un RecaptchaErrorCode.
En el siguiente ejemplo se muestra cómo migrar de getClient
a fetchClient
.
Kotlin
// Migrate from getClient
private fun initializeWithGetClient() {
recaptchaScope.launch {
Recaptcha.getClient(application, "KEY_ID")
.onSuccess { client ->
recaptchaClient = client
}
.onFailure { exception ->
// Handle errors ...
}
}
}
// Migrate to fetchClient
private fun initializeWithFetchClient() {
recaptchaScope.launch {
try {
recaptchaClient = Recaptcha.fetchClient(application, "KEY_ID")
} catch(e: RecaptchaException){
// Handle errors ...
}
}
}
Java
// Migrate from getTasksClient
private void initializeWithGetTasksClient() {
Recaptcha
.getTasksClient(getApplication(), "KEY_ID")
.addOnSuccessListener(
this,
new OnSuccessListener<RecaptchaTasksClient>() {
@Override
public void onSuccess(RecaptchaTasksClient client) {
recaptchaTasksClient = client;
}
})
.addOnFailureListener(
this,
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Handle errors ...
}
});
}
// Migrate to fetchTaskClient
private void initializeWithFetchTaskClient() {
Recaptcha
.fetchTaskClient(getApplication(), "KEY_ID")
.addOnSuccessListener(
this,
new OnSuccessListener<RecaptchaTasksClient>() {
@Override
public void onSuccess(RecaptchaTasksClient client) {
recaptchaTasksClient = client;
}
})
.addOnFailureListener(
this,
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Handle errors ...
}
});
}
Definir un tiempo de espera para las llamadas a la API
Puedes especificar un valor de tiempo de espera para las APIs execute
mediante la propiedad withTimeout
.
Kotlin
Define el tiempo de espera al llamar a
execute
.recaptchaScope.launch { recaptchaClient .execute(RecaptchaAction.LOGIN(), timeout = 10000L) .onSuccess { token -> // Handle success ... // See "What's next" section for instructions // about handling tokens. } .onFailure { exception -> // Handle errors ... // See "Handle errors" section } }
Este fragmento de código define el tiempo de espera de
execute
en 10 segundos.
Java
Define el tiempo de espera al llamar a
execute
.recaptchaTasksClient .executeTask(RecaptchaAction.custom("redeem"), 10000L) .addOnSuccessListener( this, new OnSuccessListener<String>() { @Override public void onSuccess(String token) { // Handle success ... // See "What's next" section for instructions // about handling tokens. } }) .addOnFailureListener( this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle errors ... // See "Handle errors" section } });
Este fragmento de código define el tiempo de espera de
execute
en 10 segundos.
Gestionar errores
Si tu aplicación no puede comunicarse correctamente con el servicio reCAPTCHA, puede deberse a que la API ha detectado un error. Debes añadir lógica a tu aplicación para gestionar estos errores correctamente.
Para obtener más información sobre las mitigaciones de errores comunes de la API, consulta RecaptchaErrorCode.
Referencia de la API
Para consultar una referencia completa de la API de reCAPTCHA para Android, consulta com.google.android.recaptcha
.
Siguientes pasos
Para evaluar el token de respuesta de reCAPTCHA, crea una evaluación.