--- title: Android SDK --- # Android SDK 支持 **Android 5.0+(API 21+)**,以单个 `.aar` 形式分发。Compose、传统 View 体系都可以接入,SDK 与 UI 框架无关。 ## GitHub 上的示例 ::: tip 📦 [Captcha-La/android-demo](https://github.com/Captcha-La/android-demo) — 完整可运行示例,包含所有集成步骤。 ::: ## 安装 SDK 以单个 `.aar` 形式从 [CaptchaLa 控制台](https://dash.captcha.la) 下载。将其放入 app 模块的 `libs/` 目录,并在 Gradle 中引用: ```groovy // settings.gradle (or repositories block) dependencyResolutionManagement { repositories { mavenCentral() } } // app/build.gradle android { defaultConfig { minSdk 21 } } dependencies { implementation 'la.captcha:captchala:1.0.2' // Maven Central } ``` 或者下载 AAR 手动集成: ```groovy // app/build.gradle (drop captchala.aar into app/libs/) android { defaultConfig { minSdk 21 ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } } dependencies { implementation files('libs/captchala.aar') implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.code.gson:gson:2.10.1' implementation 'org.bouncycastle:bcprov-jdk18on:1.77' } ``` 下载:[dash.captcha.la/downloads](https://dash.captcha.la/downloads)(最新 AAR)。 ```xml ``` 构建并安装 demo: ```bash ./gradlew installDebug ``` ## 快速开始 ```kotlin import la.captcha.sdk.CaptchalaClient import la.captcha.sdk.CaptchalaConfig import la.captcha.sdk.CaptchalaError import la.captcha.sdk.CaptchalaListener import la.captcha.sdk.CaptchalaResult class LoginActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 1. Fetch a one-shot server_token from YOUR backend // (which calls the CaptchaLa server API with X-App-Key + X-App-Secret). val serverToken = runBlocking { fetchServerTokenFromYourBackend() } // 2. Build config — destroy any prior client so a fresh state is built. CaptchalaClient.destroy() val client = CaptchalaClient.getClient(applicationContext).init( CaptchalaConfig.Builder() .appKey("YOUR_APP_KEY") .action("login") // login, register, pay, … .lang("en") // en, zh-CN, zh-TW, ja, ko, ms, vi, id .theme("light") // "light" | "dark" .enableVoice(true) .enableOfflineMode(true) .serverToken(serverToken) .onServerTokenExpired { fetchServerTokenFromYourBackend() } .build() ) // 3. Listen for terminal events. client.setListener(object : CaptchalaListener { override fun onReady() { /* challenge UI ready */ } override fun onSuccess(result: CaptchalaResult) { // Send result.passToken to your backend for validation. sendToBackend(result.passToken) } override fun onFail(error: CaptchalaError) { /* recoverable */ } override fun onError(error: CaptchalaError) { /* terminal */ } override fun onClose() { /* user dismissed */ } }) // 4. Open the CAPTCHA from a button tap. findViewById