--- 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