C26Capture 2026Knox Capture Knowledge Base

Knox Capture SDK 1.6.2: когда он действительно нужен

SDK — это детали сканера для разработчика Android-приложения. Из них можно сделать собственный экран сканирования: разместить изображение с камеры рядом с карточкой товара, получить несколько кодов за один кадр, показать пользователю нужный код и сразу записать результат в нужную операцию.

Обычный Knox Capture — уже собранный сканер. Он считывает код и передаёт результат в другое приложение: как ввод с клавиатуры либо через Intent.

Самая простая граница выбора:

  • нужно считать код в уже существующее поле — используйте готовый Knox Capture;
  • нужно изменить само поведение и внешний вид сканера внутри разрабатываемого приложения — рассматривайте SDK;
  • своего Android-приложения и разработчика нет — SDK использовать негде.

Что было разобрано

Проверены два оригинальных архива Samsung:

  • knoxcapture-sdk-1.6.2.zip — AAR версии 1.6.2;
  • kcapsdk_sampleapp.zip — официальный Kotlin sample app с тем же AAR.

Архивы прошли unzip -t. В sample app есть примеры full screen, split screen, multi-scan, mini scanner, Fragment и экрана с настраиваемыми параметрами.

Что SDK даёт

Возможность Что получает приложение
Своя камера внутри Activity или Fragment BarcodeScanPreviewView размещается в обычном XML layout
Результат без имитации клавиатуры callback PreviewResultHandlingCallback
Данные кода строка, symbology, raw bytes, ID и положение кода в кадре
Данные кадра разрешение, rotation и frame ID через EnvironmentData
Один или несколько кодов список barcodeResult.barcodes
Ограничение типов QR, Code 128 и другие symbology выбираются в PreviewConfig
Инвертированные коды включаются отдельно для выбранной symbology
Своя зона сканирования ширина и высота задаются в процентах кадра
Zoom и focus задаются из приложения
UI поверх камеры viewfinder, фонарик, смена камеры, logo, цветной overlay
Отбор результатов BarcodeFilter оставляет только подходящие кандидаты
GS1 parser возвращает форматированную строку и JSON
Mini Scanner небольшое перемещаемое окно, floating button и hardware keys
Звук и вибрация готовые BeepFeedback и VibrationFeedback

Поддерживаемые типы из API 1.6.2: Aztec, Codabar, Code 128, Code 39, Code 93, DataBar 14/Limited/Expanded, Data Matrix, EAN-13, EAN-8, Interleaved 2 of 5, PDF417, QR, UPC-A и UPC-E.

Что это означает на практике

Обычная инвентаризация по одному коду

Сотрудник ставит курсор в поле «Штрихкод», нажимает кнопку сканирования и получает строку. Здесь достаточно готового Knox Capture. SDK ничего заметного пользователю не добавит.

Приёмка коробки с несколькими кодами

В кадре видны код товара, серийный номер и код перевозчика. Приложение должно показать найденные рамки, взять только нужные типы кодов и разложить результаты по разным полям. Здесь SDK оправдан: приложение получает список кодов, их типы и положения в кадре.

Комплектование заказа

На экране уже показаны заказ, фотография и ожидаемый товар. Камера должна занимать нижнюю часть этого же экрана. После чтения приложение само отмечает строку заказа и сразу предлагает следующий товар. Это задача для SDK.

Проверка содержимого кода

Приложению нужны не только видимые символы, но также тип кода, исходные байты или разбор GS1 в отдельные поля. Готовый Capture частично решает такую передачу через Intent. SDK нужен, если данные должны обрабатываться прямо в собственном экране камеры до его закрытия.

Чужая программа без возможности изменить её код

Есть готовая складская, кассовая или браузерная форма. Менять её нельзя. SDK туда встроить невозможно. Используйте готовый Knox Capture и передачу результата как клавиатурный ввод.

Есть ли выигрыш в скорости и эффективности

Скорость распознавания одного кода

Заявленного преимущества SDK перед готовым Knox Capture нет. SDK не следует покупать только в надежде, что тот же телефон начнёт быстрее читать один QR или Code 128. Отдельного сравнительного теста приложения и SDK в этом проекте не проводилось.

Скорость всей рабочей операции

SDK может сократить число действий в специально разработанном процессе:

  • несколько кодов забираются из одного кадра;
  • результат сразу попадает в нужную строку документа;
  • не требуется держать фокус в текстовом поле;
  • неподходящий тип или значение можно отбросить до заполнения формы;
  • камера остаётся на том же экране, где выполняется работа.

Это выигрыш процесса, а не обещание более быстрого декодера.

Цена такого выигрыша

Потребуются изменение Android-приложения, лицензия SDK, собственный интерфейс, обработка разрешений и жизненного цикла камеры, тестирование на моделях телефонов и выпуск новых версий приложения. Для простого ввода одного кода эти работы лишние.

Чего SDK не даёт

  • Он не создаёт готовое складское приложение, форму, базу товаров или синхронизацию с сервером.
  • Он не заменяет разработку интерфейса, обработку ошибок и жизненный цикл камеры.
  • Он не выдаёт лицензию автоматически.
  • Он не разворачивает приложение на парк телефонов и не заменяет EMM/UEM.
  • Он не добавляет телефону autofocus, OIS или отдельную scan-кнопку.
  • Он не гарантирует чтение любого затёртого или перекрытого кода.
  • Он не нужен только ради вставки строки в EditText.

Готовое приложение или SDK

Задача Что выбрать
Вставить код в существующее поле готовый Knox Capture, keyboard wedge
Запускать стандартный сканер своей кнопкой готовый Knox Capture, soft trigger
Получать тип и raw data без собственного preview готовый Knox Capture, intent output
Камера должна быть частью вашего экрана SDK
Показывать сразу несколько найденных кодов SDK
Рисовать разные рамки и фильтровать кандидатов до выдачи результата SDK
Собрать полностью свой интерфейс сканера SDK

Требования из локального sample app

  • minSdkVersion 31 — Android 12 и выше в данном примере;
  • compileSdk 34, targetSdk 34 в sample app;
  • разрешение android.permission.CAMERA и обязательный camera feature;
  • AAR подключается локально из app/libs/;
  • CameraX 1.4.1: camera2, core, lifecycle, view и extensions;
  • лицензия проверяется до открытия экранов сканирования;
  • startPreview() и startBarcodeAnalyzing() запускают работу;
  • stopBarcodeAnalyzing() и finishPreview() вызываются при уходе Activity в pause.

Сам knoxcapture-sdk-1.6.2.aar занимает около 15 МБ в архиве. В нём есть нативные библиотеки только для arm64-v8a: декодер, OpenCV, TensorFlow Lite и C++ runtime. Итоговый размер APK/AAB нужно измерять после собственной сборки.

Подключение AAR

Положите файл в app/libs/knoxcapture-sdk-1.6.2.aar:

dependencies {
    implementation fileTree(dir: "libs", include: ["*.aar"])

    def camerax_version = "1.4.1"
    implementation "androidx.camera:camera-camera2:$camerax_version"
    implementation "androidx.camera:camera-core:$camerax_version"
    implementation "androidx.camera:camera-lifecycle:$camerax_version"
    implementation "androidx.camera:camera-view:$camerax_version"
    implementation "androidx.camera:camera-extensions:$camerax_version"
}

Manifest:

<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-permission android:name="android.permission.CAMERA" />

Минимальный preview и callback

Layout:

<com.samsung.android.knox.smartscan.preview.BarcodeScanPreviewView
    android:id="@+id/previewView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Kotlin:

private lateinit var preview: BarcodeScanPreviewView

private val callback = object : PreviewResultHandlingCallback {
    override fun handleBarcodes(
        result: BarcodeResult,
        environment: EnvironmentData
    ) {
        result.barcodes.firstOrNull()?.let { code ->
            val value = code.data
            val type = code.symbology
            val raw = code.rawData
            val position = code.currentPosition
            val frameId = environment.frameId

            saveBarcode(value, type, raw, position, frameId)
            preview.pausePreview()
            preview.stopBarcodeAnalyzing()
        }
    }
}

private fun startScanner() {
    preview = findViewById(R.id.previewView)

    val config = PreviewConfig.Builder()
        .setCameraResolution(SDKConstants.CameraResolutions.RESOLUTION_UHD)
        .setBarcodeScanArea(Size(90, 40))
        .setSymbology(listOf(
            BarcodeInfo.SYMBOLOGY_QR,
            BarcodeInfo.SYMBOLOGY_CODE_128
        ))
        .build()

    preview.init(config, callback)
    preview.startPreview()
    preview.startBarcodeAnalyzing()
}

override fun onPause() {
    preview.stopBarcodeAnalyzing()
    preview.finishPreview()
    super.onPause()
}

Инвертированный QR: включается явно

Обычный выбор SYMBOLOGY_QR не означает, что обратная полярность включена. В официальном sample app для этого создаётся отдельный BarcodeSettings:

val invertedQr = BarcodeSettings(BarcodeInfo.SYMBOLOGY_QR).apply {
    setSupportInverted(true)
}

val config = PreviewConfig.Builder()
    .setSymbology(listOf(BarcodeInfo.SYMBOLOGY_QR))
    .setSymbologySettings(listOf(invertedQr))
    .build()

В sample app список inverted по умолчанию пуст. Пользователь выбирает типы в настройке Support Inverted Symbologies. Доступны QR, Data Matrix, PDF417, Codabar, Code 128/39/93, EAN-13/8, Interleaved 2 of 5, UPC-A/E и Aztec.

Multi-scan и фильтр

Callback уже возвращает список. Можно сохранять уникальные пары data + symbology и не останавливать analyzer:

private val seen = linkedMapOf<String, BarcodeInfo>()

override fun handleBarcodes(result: BarcodeResult, environment: EnvironmentData) {
    result.barcodes.forEach { code ->
        seen.putIfAbsent("${code.symbology}:${code.data}", code)
    }
}

Фильтр до callback:

preview.addBarcodeFilter(object : BarcodeFilter {
    override fun filter(
        candidates: List<BarcodeInfo>,
        filteredList: MutableSet<BarcodeInfo>
    ) {
        filteredList += candidates.filter { it.data.startsWith("SKU-") }
    }
})

GS1 parser

val parser = Parser.getParser(Parser.ParserFormat.GS1_AI, context)
val parsed = parser.process(code.data)

showText(parsed.formattedString)
sendJson(parsed.jsonString)

Нужно обрабатывать ParserException: не каждый код содержит корректные GS1 Application Identifiers.

Mini Scanner

MiniScannerFrameLayout создаёт готовое небольшое окно камеры. В sample app ему задаются размер, положение, floating button и комбинация KEY_TOP | KEY_VOLUME_DOWN. Можно отключить готовую floating button и вызвать showMiniScannerView() собственной кнопкой.

Это удобно, когда форма должна оставаться видимой, а камера открывается только в части экрана.

Лицензия

Sample app блокирует все варианты сканера, пока ScanLicenseClient.getScanLicense().isActivatedLicense(context) возвращает false. Активация:

ScanLicenseClient.getScanLicense().activateLicense(
    context,
    licenseKey,
    object : LicenseActivationCallback {
        override fun onSuccess() = openScanner()
        override fun onFail(errorCode: Int) = showLicenseError(errorCode)
    }
)

Для разработки Samsung выдаёт development key через Knox Developer Portal. Для коммерческого ключа Samsung требует привязать пакет приложения через APK. Ключ нельзя хранить открытым в репозитории или статье.

Что изменилось в 1.6.2

По release notes Samsung от 23 июля 2026 улучшено распознавание кодов при yaw и pitch — то есть при наклоне камеры относительно кода. Других изменений для 1.6.2 на странице release notes не перечислено.

Практический выбор

Ответьте на вопросы:

  1. Нужно только вставить считанный текст в активное поле? Оставляйте готовый Knox Capture.
  2. Нужно одновременно находить несколько кодов и выбирать среди них? Используйте SDK.
  3. Нужно видеть форму, карточку товара или заказ одновременно с камерой? Используйте SDK.
  4. Нужны координаты каждого кода, исходные байты или собственная фильтрация до выдачи результата? Используйте SDK.
  5. Нужно полностью менять кнопки, рамки, область сканирования и поведение камеры? Используйте SDK.
  6. Приложение куплено у другого поставщика и его исходного кода нет? SDK не подойдёт; настраивайте готовый Knox Capture.

Итог: SDK оправдан не количеством телефонов и не самим фактом сканирования. Он оправдан конкретной функцией, которую нельзя получить настройкой профиля готового Knox Capture. Если такой функции нет, готовое приложение проще.

Не публикуйте AAR и sample archive на открытом сайте без проверки условий Samsung. На capture2026.ru публикуются только этот разбор и собственные примеры.

Ссылки Samsung