Alaqan Mini SDK
для Android
Интегрируйте биометрическую аутентификацию по венам ладони в ваши Android-приложения.
Введение
Alaqan Mini SDK позволяет Android-приложениям интегрировать биометрическую аутентификацию по венам ладони с использованием устройства Alaqan Mini.
Высокая безопасность
Мультиспектральная съёмка с определением живости для корпоративной безопасности.
Быстрое распознавание
Идентификация менее чем за секунду.
Простая интеграция
Простой API с подробными обратными вызовами.
Бесконтактный
Гигиеничное распознавание без физического контакта.
Сценарии использования
- Аутентификация в POS-терминалах
- Банковские и финансовые услуги
- Системы контроля доступа
- Учёт рабочего времени
- Верификация личности
Требования
Аппаратное обеспечение
| Компонент | Требование |
|---|---|
| Устройство | Сканер ладони Alaqan Mini |
| Подключение | USB Type-C |
| Хост-устройство | Android-устройство с поддержкой OTG |
Программное обеспечение
| Компонент | Требование |
|---|---|
| Android SDK | Минимум API Level 24 (Android 7.0) |
| Target SDK | API Level 31 (Android 12) рекомендуется |
| Архитектура | arm64-v8a, armeabi-v7a |
Сеть
- Активное интернет-соединение для работы SDK
- Рекомендуемая пропускная способность: 1 Мбит/с
Установка
Добавьте SDK в проект
Добавьте AAR-файл в папку libs:
app/
├── libs/
│ └── alaqan-mini-sdk-1.0.0.aar
├── src/
└── build.gradle
Настройте Gradle
Добавьте в build.gradle:
android {
defaultConfig {
minSdk 24
ndk {
abiFilters 'arm64-v8a', 'armeabi-v7a'
}
}
}
dependencies {
implementation files('libs/alaqan-mini-sdk-1.0.0.aar')
}
Настройте USB-фильтр
Создайте res/xml/device_filter.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="17992" product-id="65280" />
</resources>
Обновите 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
Жизненный цикл
| Состояние | Действие SDK |
|---|---|
onCreate() | initialize() |
onResume() | connect() |
onPause() | disconnect() |
onDestroy() | destroy() |
Справочник API
Инициализация
initialize()
fun initialize(context: Context, apiKey: String): Int
Возвращает: Код ошибки (0 — успех)
| Код | Описание |
|---|---|
| 0 | Успешно |
| 4001 | Нет интернета |
| 6001 | Неверный API-ключ |
| 6002 | API-ключ истёк |
| 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)
| Операция | Тайм-аут |
|---|---|
REGISTRATION | 30 000 мс |
IDENTIFICATION | 15 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)
| Код | Константа | Описание |
|---|---|---|
| 1001 | ERROR_DEVICE_NOT_FOUND | Устройство не найдено |
| 1002 | ERROR_USB_PERMISSION_DENIED | Нет разрешения USB |
| 1003 | ERROR_CONNECTION_FAILED | Ошибка подключения |
| 1004 | ERROR_DEVICE_DISCONNECTED | Устройство отключено |
| 1005 | ERROR_DEVICE_BUSY | Устройство занято |
Регистрация (2000-2099)
| Код | Константа | Описание |
|---|---|---|
| 2001 | ERROR_REGISTRATION_IN_PROGRESS | Уже выполняется |
| 2002 | ERROR_CAPTURE_FAILED | Ошибка захвата |
| 2003 | ERROR_QUALITY_TOO_LOW | Низкое качество |
| 2004 | ERROR_DUPLICATE_PALM | Ладонь уже зарегистрирована |
| 2005 | ERROR_REGISTRATION_TIMEOUT | Тайм-аут |
| 2006 | ERROR_REGISTRATION_FAILED | Ошибка |
Идентификация (3000-3099)
| Код | Константа | Описание |
|---|---|---|
| 3001 | ERROR_IDENTIFICATION_IN_PROGRESS | Уже выполняется |
| 3002 | ERROR_CAPTURE_FAILED | Ошибка захвата |
| 3003 | ERROR_QUALITY_TOO_LOW | Низкое качество |
| 3004 | ERROR_IDENTIFICATION_TIMEOUT | Тайм-аут |
| 3005 | ERROR_IDENTIFICATION_FAILED | Ошибка |
Сеть (4000-4099)
| Код | Константа | Описание |
|---|---|---|
| 4001 | ERROR_NETWORK_UNAVAILABLE | Нет интернета |
| 4002 | ERROR_SERVICE_UNAVAILABLE | Сервис недоступен |
| 4003 | ERROR_REQUEST_TIMEOUT | Тайм-аут запроса |
Лицензия (6000-6099)
| Код | Константа | Описание |
|---|---|---|
| 6001 | ERROR_API_KEY_INVALID | Неверный API-ключ |
| 6002 | ERROR_API_KEY_EXPIRED | API-ключ истёк |
| 6003 | ERROR_LICENSE_EXPIRED | Лицензия истекла |
| 6004 | ERROR_QUOTA_EXCEEDED | Квота превышена |
Общие (9000-9099)
| Код | Константа | Описание |
|---|---|---|
| 9001 | ERROR_SDK_NOT_INITIALIZED | SDK не инициализирован |
| 9002 | ERROR_INVALID_PARAMETER | Неверный параметр |
| 9003 | ERROR_OPERATION_CANCELLED | Отменено |
| 9999 | ERROR_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.
