--- title: Android SDK --- # Android SDK SDK Android cho **Android 5.0+ (API 21+)**, đóng gói thành một file `.aar` duy nhất. Hỗ trợ cả Compose và View truyền thống — SDK không phụ thuộc vào framework UI. ## Demo trên GitHub ::: tip 📦 [Captcha-La/android-demo](https://github.com/Captcha-La/android-demo) — ví dụ đầy đủ, có thể chạy được, kèm mọi bước tích hợp. ::: ## Cài đặt The SDK ships as a single `.aar` you download from the [CaptchaLa dashboard](https://dash.captcha.la). Drop it into your app module's `libs/` folder and reference it from 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 } ``` Hoặc tải xuống AAR để tích hợp thủ công: ```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' } ``` Download: [dash.captcha.la/downloads](https://dash.captcha.la/downloads) (latest AAR). ```xml ``` Build and install the demo with: ```bash ./gradlew installDebug ``` ## Bắt đầu nhanh ```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