Документация разработчика

Alaqan Mini SDK
для Android

Интегрируйте биометрическую аутентификацию по венам ладони в ваши Android-приложения.

Версия 1.0.0 Декабрь 2025 Android 7.0+

Введение

Alaqan Mini SDK позволяет Android-приложениям интегрировать биометрическую аутентификацию по венам ладони с использованием устройства Alaqan Mini.

Высокая безопасность

Мультиспектральная съёмка с определением живости для корпоративной безопасности.

Быстрое распознавание

Идентификация менее чем за секунду.

Простая интеграция

Простой API с подробными обратными вызовами.

Бесконтактный

Гигиеничное распознавание без физического контакта.

Сценарии использования

  • Аутентификация в POS-терминалах
  • Банковские и финансовые услуги
  • Системы контроля доступа
  • Учёт рабочего времени
  • Верификация личности

Требования

Аппаратное обеспечение

КомпонентТребование
УстройствоСканер ладони Alaqan Mini
ПодключениеUSB Type-C
Хост-устройствоAndroid-устройство с поддержкой OTG

Программное обеспечение

КомпонентТребование
Android SDKМинимум API Level 24 (Android 7.0)
Target SDKAPI Level 31 (Android 12) рекомендуется
Архитектураarm64-v8a, armeabi-v7a

Сеть

  • Активное интернет-соединение для работы SDK
  • Рекомендуемая пропускная способность: 1 Мбит/с

Установка

1

Добавьте SDK в проект

Добавьте AAR-файл в папку libs:

app/
├── libs/
│   └── alaqan-mini-sdk-1.0.0.aar
├── src/
└── build.gradle
2

Настройте Gradle

Добавьте в build.gradle:

android {
    defaultConfig {
        minSdk 24
        ndk {
            abiFilters 'arm64-v8a', 'armeabi-v7a'
        }
    }
}

dependencies {
    implementation files('libs/alaqan-mini-sdk-1.0.0.aar')
}
3

Настройте USB-фильтр

Создайте res/xml/device_filter.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <usb-device vendor-id="17992" product-id="65280" />
</resources>
4

Обновите AndroidManifest.xml

<manifest>
    <uses-feature android:name="android.hardware.usb.host" android:required="true" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            </intent-filter>
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />
        </activity>
    </application>
</manifest>

Быстрый старт

class MainActivity : AppCompatActivity(), AlaqanMiniListener {
    private lateinit var sdk: AlaqanMiniSDK

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        sdk = AlaqanMiniSDK.getInstance()
        val errorCode = sdk.initialize(this, "YOUR_API_KEY")
        if (errorCode != 0) { Log.e("Alaqan", "Ошибка: $errorCode"); return }
        sdk.setListener(this)
    }

    override fun onResume() { super.onResume(); sdk.connect() }
    override fun onPause() { super.onPause(); sdk.disconnect() }
    override fun onDestroy() { super.onDestroy(); sdk.destroy() }

    override fun onDeviceConnected() {
        Log.d("Alaqan", "Подключено: ${sdk.serialNumber}")
    }

    override fun onIdentifyFinish(result: IdentifyResult) {
        when (result.status) {
            IdentifyStatus.SUCCESS -> Log.d("Alaqan", "Найден: ${result.userId}")
            IdentifyStatus.NOT_FOUND -> Log.d("Alaqan", "Не распознан")
        }
    }
}

Архитектура SDK

Ваше приложение
UI/UX, Бизнес-логика
Alaqan Mini SDK
Управление устройством, Биометрия
Устройство Alaqan Mini
Сканер ладони

Жизненный цикл

СостояниеДействие SDK
onCreate()initialize()
onResume()connect()
onPause()disconnect()
onDestroy()destroy()

Справочник API

Инициализация

initialize()

fun initialize(context: Context, apiKey: String): Int

Возвращает: Код ошибки (0 — успех)

КодОписание
0Успешно
4001Нет интернета
6001Неверный API-ключ
6002API-ключ истёк
6003Лицензия истекла

Подключение

connect()

fun connect(): Boolean

disconnect()

fun disconnect()

isConnected

val isConnected: Boolean

Информация об устройстве

val serialNumber: String?     // например, "GX4TYQWH3D"
val firmwareVersion: String?  // например, "1.2.3"

Регистрация

startRegister()

fun startRegister(): Boolean

Обратные вызовы: onRegisterProgress(), onCaptureFeedback(), onRegisterFinish()

stopRegister()

fun stopRegister()

Идентификация

startIdentify()

fun startIdentify(): Boolean

Обратные вызовы: onCaptureFeedback(), onIdentifyFinish()

stopIdentify()

fun stopIdentify()

Конфигурация

setTimeout()

fun setTimeout(operationType: OperationType, timeoutMs: Long)
ОперацияТайм-аут
REGISTRATION30 000 мс
IDENTIFICATION15 000 мс

Обратные вызовы

interface AlaqanMiniListener {
    fun onDeviceConnected()
    fun onDeviceDisconnected()
    fun onRegisterProgress(progress: RegisterProgress)
    fun onRegisterFinish(result: RegisterResult)
    fun onIdentifyFinish(result: IdentifyResult)
    fun onCaptureFeedback(feedback: CaptureFeedback)
    fun onError(error: AlaqanError)
}

Модели данных

data class RegisterResult(
    val status: RegisterStatus,  // SUCCESS, DUPLICATE, FAILED, CANCELLED, TIMEOUT
    val userId: String?,
    val errorCode: Int?,
    val errorMessage: String?
)

data class IdentifyResult(
    val status: IdentifyStatus,  // SUCCESS, NOT_FOUND, FAILED, CANCELLED, TIMEOUT
    val userId: String?,
    val confidence: Float?,     // 0.0-1.0
    val errorCode: Int?,
    val errorMessage: String?
)

data class CaptureFeedback(
    val status: CaptureStatus,
    val guidance: CaptureGuidance?,  // MOVE_CLOSER, MOVE_FARTHER, CENTER_PALM...
    val qualityScore: Float
)

Коды ошибок

Подключение (1000-1099)

КодКонстантаОписание
1001ERROR_DEVICE_NOT_FOUNDУстройство не найдено
1002ERROR_USB_PERMISSION_DENIEDНет разрешения USB
1003ERROR_CONNECTION_FAILEDОшибка подключения
1004ERROR_DEVICE_DISCONNECTEDУстройство отключено
1005ERROR_DEVICE_BUSYУстройство занято

Регистрация (2000-2099)

КодКонстантаОписание
2001ERROR_REGISTRATION_IN_PROGRESSУже выполняется
2002ERROR_CAPTURE_FAILEDОшибка захвата
2003ERROR_QUALITY_TOO_LOWНизкое качество
2004ERROR_DUPLICATE_PALMЛадонь уже зарегистрирована
2005ERROR_REGISTRATION_TIMEOUTТайм-аут
2006ERROR_REGISTRATION_FAILEDОшибка

Идентификация (3000-3099)

КодКонстантаОписание
3001ERROR_IDENTIFICATION_IN_PROGRESSУже выполняется
3002ERROR_CAPTURE_FAILEDОшибка захвата
3003ERROR_QUALITY_TOO_LOWНизкое качество
3004ERROR_IDENTIFICATION_TIMEOUTТайм-аут
3005ERROR_IDENTIFICATION_FAILEDОшибка

Сеть (4000-4099)

КодКонстантаОписание
4001ERROR_NETWORK_UNAVAILABLEНет интернета
4002ERROR_SERVICE_UNAVAILABLEСервис недоступен
4003ERROR_REQUEST_TIMEOUTТайм-аут запроса

Лицензия (6000-6099)

КодКонстантаОписание
6001ERROR_API_KEY_INVALIDНеверный API-ключ
6002ERROR_API_KEY_EXPIREDAPI-ключ истёк
6003ERROR_LICENSE_EXPIREDЛицензия истекла
6004ERROR_QUOTA_EXCEEDEDКвота превышена

Общие (9000-9099)

КодКонстантаОписание
9001ERROR_SDK_NOT_INITIALIZEDSDK не инициализирован
9002ERROR_INVALID_PARAMETERНеверный параметр
9003ERROR_OPERATION_CANCELLEDОтменено
9999ERROR_UNKNOWNНеизвестная ошибка

Лучшие практики

Совет

Всегда проверяйте isConnected перед запуском операций.

Обработка ошибок

Используйте диапазоны кодов ошибок для группированной обработки:

override fun onError(error: AlaqanError) {
    when (error.code) {
        in 1000..1099 -> handleConnectionError(error)
        in 2000..2099 -> handleRegistrationError(error)
        in 3000..3099 -> handleIdentificationError(error)
        in 4000..4099 -> handleNetworkError(error)
        in 6000..6099 -> handleLicenseError(error)
        else -> handleGeneralError(error)
    }
}

Устранение неполадок

Устройство не обнаружено

Симптомы: onDeviceConnected() не вызывается, ERROR_DEVICE_NOT_FOUND

  • Проверьте подключение Alaqan Mini
  • Убедитесь, что USB OTG включён
  • Проверьте device_filter.xml на правильность VID/PID
  • Попробуйте другой USB-кабель

Ошибка разрешения USB

Симптомы: ERROR_USB_PERMISSION_DENIED

  • Убедитесь, что диалог разрешения USB отображается и принимается
  • Проверьте правильность обработки USB-интентов в Activity
  • Очистите данные приложения и попробуйте снова

Ошибка инициализации SDK

Симптомы: initialize() возвращает ненулевое значение

  • Проверьте правильность API-ключа
  • Убедитесь в наличии интернет-соединения
  • Проверьте, не истёк ли срок действия API-ключа
  • Проверьте logcat для получения подробных сообщений об ошибках

Пример реализации

Свяжитесь с поддержкой Alaqan для получения полного примера проекта.

Поддержка

Техническая поддержка

support@alaqan.com

Коммерческие вопросы

sales@alaqan.com

При сообщении о проблемах

Укажите: код ошибки, шаги воспроизведения, серийный номер, версию SDK.