# Samsung Knox Capture: установка, настройка кнопок, тестирование и интеграция в Android-приложение

Дата практического прогона: 23 сентября 2026 года.

Это полный практический гайд и отчёт живого сравнения двух телефонов: rugged
Samsung Galaxy XCover7 Pro (`SM-G766B`) и обычного Galaxy A18 (`SM-A185F`). Мы
проверили установку без повторного входа в Google Play, все разделы меню,
аппаратные и экранные триггеры, QR/Code 128, уменьшенные, размытые, низкоконтрастные,
повёрнутые и повреждённые коды, keyboard wedge и способы интеграции в Android.
Для каждого опыта сохранены скриншоты с обоих аппаратов, ADB baseline и logcat.

## Что получилось

| Параметр | Значение |
|---|---|
| Устройства | Samsung `SM-G766B` (`xcover7pro`) и `SM-A185F` (`a18`) |
| Android | 16 / 17 |
| Security patch | 2026-07-05 |
| Knox Capture | `2.6.00.0`, version code `260000000` |
| Тестовое приложение | `com.example.knoxwedgetest`, версия `1.0.1` |
| Профиль | `Wedge Test` |
| Тестовый QR | `ABC-1234` |
| Результат | `ABC-1234` появился в поле Barcode |
| Медиана чистого QR после прогрева | `882.68 ms` / `1112.40 ms` |
| Повреждённая серия | оба телефона: 6 успехов из 9 условий |
| Crash / ANR | не обнаружены |

Первоначальный XCover-прогон дал 1985 ms. Сравнение ниже использует исправленную
версию тестового приложения и отдельные серии. Метрика измерена от наблюдаемого
trigger до изменения `EditText`; она включает открытие preview, экспозицию/фокус,
распознавание и вывод, а не только работу декодера.

## 1. Установка

Knox Capture устанавливался из Google Play по package name
`com.samsung.android.app.smartscan`. После установки на странице появились
кнопки «Удалить» и «Открыть».

![Knox Capture установлен из Google Play](screenshots/01-google-play-installed.png)

Проверка через ADB:

```bash
adb shell pm path com.samsung.android.app.smartscan
adb shell dumpsys package com.samsung.android.app.smartscan \
  | grep -E 'versionCode=|versionName=|firstInstallTime=|lastUpdateTime='
```

Фактически зафиксировано:

```text
versionName=2.6.00.0
versionCode=260000000
firstInstallTime=2026-09-23 17:01:25
```

Camera permission выдавался только при первом фактическом запуске scanner и
только в режиме «При использовании приложения». Bluetooth и notification
permissions для этого базового теста не требовались.

### Как не входить в Google Play на каждом телефоне

Один раз установленный пакет был извлечён с XCover и поставлен на A18 через ADB:

```bash
adb -s R3CY10C02FH shell pm path com.samsung.android.app.smartscan
adb -s R3CY10C02FH pull \
  /data/app/.../com.samsung.android.app.smartscan.../base.apk \
  KnoxCapture-2.6.00.0.apk
sha256sum KnoxCapture-2.6.00.0.apk
adb -s R3GL50BX17T install KnoxCapture-2.6.00.0.apk
```

Наш проверенный APK:

```text
размер: 38,506,001 bytes
SHA-256: 1858f5a5e710a46c5c646fb720acf5482a6461028dd8bf73c50f9d0fe5d5d712
package: com.samsung.android.app.smartscan
version: 2.6.00.0
```

На A18 приложение запустилось без Google-аккаунта и показало 100 из 100
бесплатных сканирований. Значит, для лабораторной партии можно использовать
один проверенный APK. Но у sideload-установки `installerPackageName=null`, поэтому
автоматическое обновление через Play не гарантировано. Для промышленного парка
правильный путь — managed Google Play/EMM либо контролируемая рассылка и проверка
хэша/версии APK. Копирование APK не отменяет коммерческое лицензирование Knox
Capture.

### Установка тестового приёмника

Одна и та же сборка `KnoxWedgeTest-debug.apk` 1.0.1 установлена на оба телефона.
Её SHA-256:

```text
7389be2322a80f9dbc665fe99bc94d5ccdb37db8febbeb39568303acde7d680d
```

Версия 1.0.1 обнуляет timestamp после каждого `text_changed`, поэтому следующий
скан не наследует задержку предыдущего.

## 2. Профили: зачем они нужны

Knox Capture работает как программный keyboard wedge: камера распознаёт код, а
результат передаётся целевому приложению так, будто пользователь ввёл данные с
клавиатуры. Поведение определяется профилем:

1. какие приложения и Activity используют профиль;
2. какие типы штрихкодов распознаются;
3. какой режим камеры применяется;
4. как форматируются данные;
5. добавляются ли Enter, Tab, prefix или suffix.

На главной странице остался системный профиль по умолчанию и появился отдельный
профиль `Wedge Test`.

![Главная страница со списком профилей](screenshots/02-profiles-home.png)

### Создание тестового профиля

1. На странице «Профили» нажать `+`.
2. Выбрать «Создание профиля», а не дублирование существующего.
3. Ввести имя `Wedge Test`.
4. В списке приложений найти `Knox Wedge Test`.
5. Выбрать приложение целиком — «Все действия».
6. Нажать «Создать профиль».

В готовом профиле тестовое приложение видно в разделе «Приложения».

![Профиль Wedge Test и привязанное приложение](screenshots/03-wedge-test-profile.png)

При необходимости можно привязывать не весь package, а отдельные Android
Activity. Это полезно, когда экран приёмки должен завершать скан нажатием Tab,
а экран поиска — Enter. Одна Activity может принадлежать только одному профилю.

![Выбор приложения для профиля](screenshots/03b-profile-app-selection.png)

## Полный разбор меню Knox Capture 2.6

Ниже — одно и то же меню на двух протестированных аппаратах.

| XCover7 Pro | Galaxy A18 |
|---|---|
| ![Меню на SM-G766B](screenshots/33-sm-g766b-main-menu.png) | ![Меню на SM-A185F](screenshots/12-sm-a185f-main-menu.png) |

### Knox Capture AR

Это не «ускоритель камеры» и не обязательная часть обычного сканирования. AR
накладывает сведения на найденные коды прямо в preview и даёт два сценария:

- **Search and find** — найти среди множества кодов позицию, совпавшую с
  поисковым условием;
- **View and update** — показать или изменить поля товара, если настроены AR
  template и источник данных/сервер.

`AR demo` позволяет посмотреть View and update без backend, но это демонстрация
с ограниченным числом сканов, а не готовая товарная база. `AR configuration`
нужна администратору для шаблона, источника данных и поведения overlay.

| XCover7 Pro | Galaxy A18 |
|---|---|
| ![Knox Capture AR на XCover](screenshots/36-sm-g766b-knox-capture-ar.png) | ![Knox Capture AR на A18](screenshots/22-sm-a185f-knox-capture-ar.png) |

### Тестировать приложения

Test mode запускает выбранное приложение и рисует диагностический overlay. В нём
видны Activity, применившийся профиль, тип вывода и raw/result data. Это первый
инструмент проверки, когда сканер открылся, но строка не попала в нужный экран.

![Список приложений Test mode](screenshots/21-sm-a185f-test-apps.png)

### Импортировать

Импорт загружает ранее экспортированные настройки/профили. Подтверждение прямо
предупреждает, что текущая конфигурация будет перезаписана. Перед импортом нужно
сделать экспорт; APK приложения и лицензия этим файлом не переносятся.

![Предупреждение импорта](screenshots/20-sm-a185f-import.png)

### Триггеры сканирования камерой

Здесь включаются Samsung Keyboard, floating button, аппаратные клавиши,
двойное нажатие Side key и запуск intent-ом бизнес-приложения. Полный разбор
различий между rugged и обычным смартфоном дан в разделе о кнопках ниже.

| XCover7 Pro | Galaxy A18 без специальной клавиши |
|---|---|
| ![Триггеры XCover](screenshots/34-sm-g766b-camera-triggers.png) | ![Триггеры A18](screenshots/13-sm-a185f-camera-triggers.png) |

### Подключить сканер

Это настройка **внешнего аппаратного сканера**, а не камеры телефона. Здесь
сопрягается поддерживаемый Bluetooth-сканер; Samsung также документирует USB
wedge devices. Чтобы он участвовал в профиле, внутри scanner settings включают
`Hardware scanner`. Наличие Bluetooth-устройства само по себе не превращает
камеру в аппаратный сканер.

| XCover7 Pro | Galaxy A18 |
|---|---|
| ![Подключение scanner на XCover](screenshots/37-sm-g766b-connect-scanner.png) | ![Подключение scanner на A18](screenshots/15-sm-a185f-connect-scanner.png) |

### Путь вывода

Этот пункт отправляет результат по Bluetooth на сопряжённый компьютер/устройство,
эмулируя Bluetooth keyboard. В интерфейсе указано важное ограничение: функция
работает с default scanning profile. Это не то же самое, что Android Intent
output в своё приложение.

| XCover7 Pro | Galaxy A18 |
|---|---|
| ![Output path XCover](screenshots/38-sm-g766b-output-path.png) | ![Output path A18](screenshots/16-sm-a185f-output-path.png) |

### Наложение сканера

Scanner overlay — маленькое изменяемое и перемещаемое окно камеры поверх
бизнес-приложения. Оно полезно, когда оператор должен видеть форму во время
сканирования. По умолчанию выключено; приложению может понадобиться разрешение
рисовать поверх других окон.

| XCover7 Pro | Galaxy A18 |
|---|---|
| ![Scanner overlay XCover](screenshots/39-sm-g766b-scanner-overlay.png) | ![Scanner overlay A18](screenshots/17-sm-a185f-scanner-overlay.png) |

### Лаборатория производительности

Performance Lab содержит экспериментальные опции для сложной сцены:

- low-light notification — подсказка о недостатке света;
- auto exposure — автоматическая коррекция экспозиции;
- auto zoom — приближение найденного кода.

Auto zoom предназначен для automatic single scan и не применяется к continuous
scan и scanner overlay. Эти переключатели нужно A/B-тестировать: они могут помочь
на дальнем/тёмном коде, но изменить время стабильной простой сцены.

| XCover7 Pro | Galaxy A18 |
|---|---|
| ![Performance Lab XCover](screenshots/35-sm-g766b-performance-lab.png) | ![Performance Lab A18](screenshots/14-sm-a185f-performance-lab.png) |

### Удалить

Открывает список пользовательских профилей с чекбоксами и `Все`. Системный
default profile в список удаления не попадает. Сам вход безопасен; удаление
происходит только после выбора и подтверждения. В тесте мы ничего не удаляли.

| XCover7 Pro | Galaxy A18 |
|---|---|
| ![Выбор профилей на XCover](screenshots/40-sm-g766b-delete-profiles.png) | ![Выбор профилей на A18](screenshots/41-sm-a185f-delete-profiles.png) |

### Лицензия

Показывает активацию и остаток бесплатных сканов, позволяет применить временную
или коммерческую лицензию. На свежей sideload-установке A18 было 100/100, на
XCover после экспериментов — 78/100. Лимит нужно учитывать: диагностические
попытки тоже могут расходовать бесплатные сканы.

![Лицензия на A18](screenshots/18-sm-a185f-license.png)

### Поддержка

Содержит Quick help, Guides, FAQ, Courses, Release notes, Privacy, About и Contact
support, а также путь к temporary license. Release notes особенно важны при
сравнении результатов между версиями scanner engine.

![Раздел поддержки](screenshots/19-sm-a185f-support.png)

## 3. Параметры scanner

В профиле открываем `Knox Capture` в разделе «Сканер».

![Параметры сканирующего модуля](screenshots/04-scanner-settings.png)

Для первого теста использовались:

- режим: одиночное сканирование;
- выбор: автоматический;
- камера: задняя;
- zoom: `1.0`;
- звуковой сигнал: включён;
- вибрация: включена;
- Parse GS1: выключен.

QR уже был включён в наборе по умолчанию. В том же списке были активны Code 128,
Code 39, EAN8, EAN13, PDF417, Data Matrix, UPCA, UPCE и Interleaved 2 of 5.

![Выбор symbology](screenshots/05-barcode-types.png)

Тот же список на втором устройстве:

![Типы кодов на Galaxy A18](screenshots/24-sm-a185f-barcode-types.png)

### Все типы кодов Knox Capture

По актуальной таблице Samsung scan engine поддерживает следующие symbology.
Максимальная длина — предел данных, а «по умолчанию» — состояние нового профиля,
которое администратор может изменить.

| Тип | Класс | Максимальная длина | Включён по умолчанию |
|---|---|---:|---:|
| Codabar | 1D | 23 | нет |
| EAN-13 | 1D retail | 13 | да |
| EAN-8 | 1D retail | 8 | да |
| Interleaved 2 of 5 (ITF) | 1D | 50 | да |
| UPC-A | 1D retail | 12 | да |
| UPC-E | 1D retail | 8 | да |
| GS1 DataBar-14 | 1D GS1 | 14 | нет |
| GS1 DataBar Limited | 1D GS1 | 14 | нет |
| Code 128 / GS1-128 | 1D | 41 | да |
| Code 39 | 1D | 33 | да |
| Code 93 | 1D | 50 | нет |
| GS1 DataBar Expanded | 1D GS1 | 46 цифр или 26 буквенно-цифровых | нет |
| Data Matrix | 2D | 3095 | да |
| PDF417 | stacked 2D | 1661 | да |
| QR Code | 2D | 6738 | да |
| Aztec | 2D | 1194 | нет |

Внутри отдельных типов доступны дополнительные настройки: inverted recognition
(выключено по умолчанию), обязательные 2/5-digit add-ons для EAN/UPC, возврат
UPC-E как UPC-A, Full ASCII для Code 39 и regex validation. Regex позволяет не
просто прочитать код, а принять только допустимый формат; отклонённые значения
можно подсветить в viewfinder.

### Режимы камеры

- **Single scan / Automatic** — первый уверенно найденный код сразу возвращается;
- **Single / Aim or tap** — оператор выбирает код при сложной сцене;
- **Continuous** — поток последовательных результатов;
- **Batch / Tap to select** — выбор нескольких кодов в одном кадре.

Отдельно настраиваются прямоугольный или laser viewfinder, flash Off/On/Auto,
zoom 1–4 и Parse GS1. GS1 parsing следует включать только если приложение ожидает
разобранные application identifiers, а не исходную строку.

### Что изменилось в последних версиях

В Knox Capture 2.5 новый engine по умолчанию улучшил дальность и скорость,
распознавание повреждённых, очень маленьких и длинных кодов; Scandit edition была
выведена из использования. Версия 2.6, которую мы тестировали, улучшила чтение
при yaw/pitch — когда телефон смотрит на код не перпендикулярно — и обновила SDK
до 1.6.2. Наш fixture с поворотом изображения на 32° проверяет roll в плоскости,
но не заменяет отдельный физический тест yaw/pitch.

Для воспроизводимого сравнения устройств нельзя одновременно менять код,
освещение, дистанцию, trigger и target application.

## 4. Keyboard output, Enter и Tab

В профиле раздел «Вывод нажатием клавиши» управляет тем, как Knox Capture
передаёт символы. В нашем baseline значения Enter и Tab оставлены `None`, поэтому
после `ABC-1234` не отправлялся дополнительный управляющий символ.

![Параметры keystroke output](screenshots/04b-keystroke-output-settings.png)

Для реального workflow обычно выбирают один из вариантов:

- suffix Enter — отправить форму или подтвердить товар;
- suffix Tab — перейти к Quantity или следующему полю;
- prefix/suffix — добавить служебную метку;
- key event delay — замедлить отправку, если старое приложение теряет символы;
- advanced rules — применять преобразования только к определённой symbology,
  длине или содержимому.

Важно: добавить Enter/Tab в basic formatting недостаточно. В keystroke output
нужно также выбрать, передавать его как строку, key event или обоими способами.

## 5. Назначение кнопок запуска scanner

Путь: главная страница Knox Capture → меню с тремя точками →
«Триггеры сканирования камерой».

![Настройка trigger-кнопок](screenshots/06-camera-scan-triggers.png)

### Кнопка на Samsung Keyboard

Если Samsung Keyboard выбрана клавиатурой по умолчанию, в её toolbar появляется
иконка Knox Capture. Последовательность работы:

1. открыть бизнес-приложение;
2. поставить cursor в нужный `EditText`;
3. нажать иконку Knox Capture в toolbar клавиатуры;
4. навести камеру на код;
5. дождаться звука и возврата в приложение.

Это был основной trigger в успешном тесте.

### XCover key

На rugged-устройстве включён переключатель «Аппаратная клавиша», выбран
`XCover key`. Это большая программируемая клавиша на левой стороне корпуса.
По документации Samsung она является стандартным camera scan trigger на rugged
Galaxy. Если системные настройки или EMM уже назначили этой клавише другую
функцию, Knox Capture может не получить нажатие.

Для ручного теста нужно нажать физическую XCover key, когда target field имеет
focus. ADB-команда `input keyevent 1015` использовалась только для диагностики:
она мгновенно отправляет key-down и key-up и не заменяет проверку физической
кнопки.

### Top key

На моделях с верхней аппаратной кнопкой Knox Capture может предложить `Top key`.
Опция зависит от конкретного устройства и его key mapping. На данном экране
XCover7 Pro был выбран именно `XCover key`.

### Side key double press

На поддерживаемых моделях можно назначить двойное нажатие Side/Power key.
Доступность пункта зависит от модели и системного назначения Side key.

### Floating action button

Floating action button создаёт постоянную кнопку scanner поверх целевого
приложения. Она удобна, если нет rugged-клавиш и не хочется открывать клавиатуру.
В финальной конфигурации теста floating button выключена: основной сценарий
проверял Samsung Keyboard и XCover key отдельно.

### Смартфон без XCover/Top key: практический выбор

Galaxy A18 подтвердил, что специальная клавиша не требуется. Его ADB input map
содержит только Power и Volume, а меню Knox Capture предлагает четыре рабочих
пути: кнопку Samsung Keyboard, floating action button, двойное нажатие Side key
и intent из бизнес-приложения.

Рекомендуемый порядок для обычного смартфона:

1. Для быстрого внедрения — Samsung Keyboard: cursor уже стоит в поле.
2. Для оператора в перчатках/киоска — floating button, если разрешён overlay.
3. Для собственного приложения — явная кнопка «Сканировать» и soft-trigger intent.
4. Side key double press — только после проверки, что системное назначение кнопки
   не конфликтует с камерой, SOS или политикой EMM.

Кнопка клавиатуры требует именно Samsung Keyboard по умолчанию. Если парк
использует Gboard или закрывает клавиатуру, лучше floating button либо интеграция
intent. На rugged XCover отдельная клавиша быстрее и предсказуемее в поточном
режиме, но это эргономическое преимущество, а не другой decoder.

Во время отладки выяснилось, что focus терял не Knox Capture, а первоначальная
версия нашего test app: после каждого события она вызывала
`ScrollView.fullScroll(View.FOCUS_DOWN)`. Этот вызов переносил focus из Barcode в
журнал. Исправление — прокручивать без смены focus:

```java
logScroll.post(() -> logScroll.smoothScrollTo(0, eventLog.getBottom()));
```

После исправления Barcode стабильно оставался focused, Samsung Keyboard не
закрывалась, а результат wedge попадал в правильное поле.

## 6. Фактический QR-тест

Для теста создан QR с payload `ABC-1234`:

```bash
qrencode -o QR-ABC-1234.png -s 20 -m 4 'ABC-1234'
```

Перед попыткой запущен полный logcat:

```bash
tools/collect-device-info.sh first-qr-final
tools/start-log first-qr-final
```

Поле Barcode получило focus, после чего scanner был запущен кнопкой Knox Capture
на Samsung Keyboard.

![Поле Barcode перед сканированием](screenshots/07-wedge-test-before-scan.png)

Scanner открыл заднюю камеру. На экране доступны flashlight, смена камеры и
кнопка «Готово».

![Камера Knox Capture](screenshots/08-scanner-camera-no-code.png)

После наведения на QR scanner автоматически закрылся и `ABC-1234` появился в
Barcode.

Первый успешный результат подтвердил сам путь передачи данных через keyboard
wedge:

![Первое успешное сканирование ABC-1234](screenshots/09-first-success-abc-1234.png)

После исправления focus и повторного чистого прогона получен финальный результат:

![Успешный результат ABC-1234](screenshots/10-final-run-result.png)

События, записанные приложением:

```text
17:21:28.960  focus_gained  field=Barcode
17:21:29.795  key_down      keyCode=1102
17:21:31.781  text_changed  value=ABC-1234  outputLatencyMs=1985.299843
```

Важный практический вывод: строка пришла одним `text_changed`; приложение не
должно рассчитывать, что каждый символ barcode обязательно появится как
отдельный `onKeyDown`. Для получения итогового значения нужен `TextWatcher` или
аналогичный listener изменения текста.

После теста на странице лицензии отображалось 78 из 100 бесплатных сканирований.
Начальное значение до всех диагностических попыток отдельно не было снято,
поэтому нельзя утверждать, сколько именно попыток израсходовал этот один успешный
прогон.

![Бесплатный лимит после теста](screenshots/11-license-free-scans.png)

## Сравнение XCover7 Pro и Galaxy A18

### Методика

Оба телефона использовали Knox Capture 2.6.00.0, один профиль, заднюю камеру,
Automatic single scan и одно приложение Knox Wedge Test 1.0.1. Fixture выводился
на одном мониторе. Перед trigger телефон уже был направлен на код — как пояснил
оператор, он держал камеру в направлении кода и ждал. Поэтому результат —
**pre-aimed trigger-to-text**, а не время поиска этикетки человеком.

В метрику входят запуск preview, экспозиция/автофокус, decoder и keyboard output.
Температура, точное положение рук и фаза фокуса не были лабораторно зажаты, так
что четыре повтора дают практический ориентир, но не сертификационный benchmark.

| Этап | XCover7 Pro | Galaxy A18 |
|---|---:|---:|
| Первый холодный чистый QR | 2788.43 ms | 2797.31 ms |
| Тёплые повторы | 922.77; 893.00; 872.36; 869.05 ms | 1103.42; 1153.13; 1112.63; 1112.18 ms |
| Среднее тёплых повторов | **889.29 ms** | **1120.34 ms** |
| Медиана тёплых повторов | **882.68 ms** | **1112.40 ms** |

Холодный первый запуск практически совпал: около 2.8 s, то есть его определяет
инициализация scanner/camera. После прогрева XCover имел медиану на 229.73 ms
ниже; A18 был примерно на 26% медленнее относительно XCover. Это не означает,
что любой XCover всегда быстрее любого A18, но в зафиксированной одинаковой
сцене разница устойчива во всех четырёх тёплых повторах.

| До скана | Результат |
|---|---|
| ![A18 перед чистым тестом](screenshots/28-sm-a185f-clean-before.png) | ![A18 результат](screenshots/29-sm-a185f-clean-result.png) |
| ![XCover перед сравнением](screenshots/30-sm-g766b-comparison-before.png) | ![XCover результат](screenshots/31-sm-g766b-comparison-result.png) |

### Повреждённые и сложные коды

Все QR содержали `ABC-1234` и были созданы с error correction H. Timeout — 6 s.
Inverted recognition оставался выключен, поэтому провал инвертированного QR —
ожидаемый результат настройки, а не поломка camera engine.

| Fixture | XCover7 Pro | Galaxy A18 | Итог |
|---|---:|---:|---|
| маленький QR, 28% canvas | 923.28 ms | 1584.45 ms | оба прочитали |
| низкий контраст, 22% | 918.36 ms | 1256.85 ms | оба прочитали |
| Gaussian blur 2.4 px | 945.31 ms | 1269.94 ms | оба прочитали |
| пять белых диагональных царапин | timeout | timeout | не прочитан |
| белое перекрытие центра 160×150 | timeout | timeout | не прочитан |
| QR повёрнут в плоскости на 32° | 892.32 ms | 1169.00 ms | оба прочитали |
| инвертированный QR | timeout | timeout | ожидаемо при disabled inverted |
| чистый Code 128 | 1000.38 ms | 2756.58 ms | оба прочитали |
| Code 128 с gap/царапинами | 972.22 ms | 1839.61 ms | оба прочитали |
| Общий success | **6/9** | **6/9** | одинаковая надёжность этой серии |

Один damaged Code 128 оказался быстрее clean Code 128 на каждом телефоне. Это
одиночный прогон с меняющимся фокусом, поэтому нельзя делать вывод, будто
повреждение ускоряет decoder. Значимый вывод только бинарный: оба варианта были
прочитаны. Для статистики каждого fixture нужно не менее 20 повторов со стойкой,
фиксированной дистанцией и освещением.

### Скриншоты каждого fixture на обоих телефонах

| Условие | XCover7 Pro | Galaxy A18 |
|---|---|---|
| маленький QR | ![XCover small](screenshots/SM-G766B-02-qr-h-small.png) | ![A18 small](screenshots/SM-A185F-02-qr-h-small.png) |
| низкий контраст | ![XCover low contrast](screenshots/SM-G766B-03-qr-h-low-contrast.png) | ![A18 low contrast](screenshots/SM-A185F-03-qr-h-low-contrast.png) |
| blur | ![XCover blur](screenshots/SM-G766B-04-qr-h-blur.png) | ![A18 blur](screenshots/SM-A185F-04-qr-h-blur.png) |
| царапины | ![XCover scratched](screenshots/SM-G766B-05-qr-h-scratched.png) | ![A18 scratched](screenshots/SM-A185F-05-qr-h-scratched.png) |
| перекрытый центр | ![XCover occlusion](screenshots/SM-G766B-06-qr-h-center-occlusion.png) | ![A18 occlusion](screenshots/SM-A185F-06-qr-h-center-occlusion.png) |
| roll 32° | ![XCover roll](screenshots/SM-G766B-07-qr-h-roll-32deg.png) | ![A18 roll](screenshots/SM-A185F-07-qr-h-roll-32deg.png) |
| inverted | ![XCover inverted](screenshots/SM-G766B-08-qr-h-inverted.png) | ![A18 inverted](screenshots/SM-A185F-08-qr-h-inverted.png) |
| Code 128 clean | ![XCover Code128](screenshots/SM-G766B-09-code128-clean.png) | ![A18 Code128](screenshots/SM-A185F-09-code128-clean.png) |
| Code 128 damaged | ![XCover damaged Code128](screenshots/SM-G766B-10-code128-damaged.png) | ![A18 damaged Code128](screenshots/SM-A185F-10-code128-damaged.png) |

## Аппаратный паспорт и влияние железа

Для обоих телефонов сняты CPU/GPU, RAM, накопитель, экран, все Camera2/HAL ID,
датчики, батарея, радио, USB, audio, biometric и input devices. Полный паспорт
доступен отдельным документом, а здесь — параметры, связанные со сканированием.

| Параметр | XCover7 Pro (`SM-G766B`) | Galaxy A18 (`SM-A185F`) |
|---|---|---|
| SoC | QTI `SM7635` | Samsung `s5e8365` |
| CPU | 4×1.8048 + 3×2.4 + 1×2.496 ГГц | 6×2.002 + 2×2.4 ГГц |
| GPU | Adreno 810 | Mali-G68 |
| `MemTotal` | 5.26 GiB | 3.52 GiB |
| Экран | 1080×2408, 120 Hz | 1080×2340, 90 Hz |
| Основная Camera2 | 4080×3060 readout, max-resolution 8160×6120, sensor 5.2224×3.9168 mm, f/1.8, 3.86 mm, AF 10 D, flash | 4080×3060, sensor 5.2224×3.9168 mm, f/1.8, 3.86 mm, AF 10 D, flash, OIS advertised |
| Широкоугольная | 3264×2448, f/2.2, 1.64 mm, fixed focus | 2576×1932, f/2.2, 1.40 mm, fixed focus |
| Клавиша | отдельный `KEY_MACRO17` / XCover key | только Power/Volume |

Основные камеры по публичным Camera2-параметрам близки, а XCover быстрее. Это
наглядно показывает, почему «больше мегапикселей» недостаточно. На итог влияют:

1. **Оптика, свет и автофокус.** Нерезкий или смазанный 1D-код decoder не спасёт;
   low light увеличивает выдержку и задержку.
2. **Сенсор и ISP.** Размер читаемого кадра, шумоподавление, exposure/AF pipeline
   и Camera HAL определяют качество картинки, которую увидит Capture.
3. **SoC.** CPU/DSP/GPU/NPU участвуют в запуске pipeline и обработке/декодировании.
4. **RAM.** Влияет прежде всего на то, останутся ли Capture и бизнес-приложение в
   памяти. Она важнее для cold/warm launch, чем для самого одного decode.
5. **Накопитель.** Почти не влияет на единичное распознавание; важен для старта,
   установки и записи больших логов/базы.
6. **Профиль.** Чем больше symbology и сложных режимов разрешено, тем шире поиск.
   Оставляйте только используемые типы и проверяйте результат A/B-тестом.
7. **Эргономика trigger.** Rugged key сокращает действия оператора, хотя engine
   остаётся тем же классом программного сканера.

Полный обезличенный паспорт: [hardware-inventory.md](hardware-inventory.md).
Численные результаты: [metrics.json](results/metrics.json).

## 7. Как встроить Knox Capture в своё приложение

Есть четыре уровня интеграции. Для Phase 1 рекомендуется начинать с первого.

### Вариант A — чистый keyboard wedge, без Knox SDK

Приложение остаётся обычным Android-приложением:

- использует стандартные `EditText`;
- не запрашивает Camera permission;
- не содержит ZXing;
- не содержит Knox Capture SDK;
- не распознаёт barcode самостоятельно.

Администратор добавляет package/Activity приложения в профиль Knox Capture.
После сканирования приложение видит обычное изменение текста.

Минимальный Kotlin-паттерн:

```kotlin
barcodeEditText.requestFocus()

barcodeEditText.doAfterTextChanged { editable ->
    val value = editable?.toString().orEmpty()
    // validate and update UI; do not assume per-character KeyEvents
}

barcodeEditText.setOnEditorActionListener { _, actionId, event ->
    val enter = actionId == EditorInfo.IME_ACTION_DONE ||
        event?.keyCode == KeyEvent.KEYCODE_ENTER
    if (enter) submitBarcode(barcodeEditText.text.toString())
    enter
}
```

Для формы `Barcode → Quantity → Location` удобно настроить Tab после Barcode или
управлять переходом самим приложением после валидации. Не следует автоматически
сохранять данные при каждом `text_changed`: Knox может передать строку целиком,
пользователь тоже может редактировать её вручную.

Преимущества: минимальная разработка, нет camera code, легко работает с legacy
forms и WebView. Недостаток: результат зависит от focus и настроек keyboard
output.

### Вариант B — soft trigger из интерфейса бизнес-приложения

Если нужна собственная кнопка «Scan», но результат всё ещё можно получать через
wedge/настроенный output, приложение отправляет официальный broadcast в Knox
Capture. Это не Capture SDK.

```kotlin
val intent = Intent().apply {
    action = "com.samsung.android.knox.intent.api.ACTION"
    putExtra("com.samsung.android.knox.intent.api.TRIGGER_ACTION", "START")
    setPackage("com.samsung.android.app.smartscan")
    putExtra("scanner_mode", "Single scan")
    putExtra("barcode_selection", "Automatic")
    putExtra("parse_gs1", false)

    val callback = PendingIntent.getActivity(
        this@MainActivity,
        0,
        Intent(this@MainActivity, MainActivity::class.java),
        PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )
    putExtra("pending_intent", callback)
}
sendBroadcast(intent)
```

На стороне Knox Capture нужно включить:

1. Options → Camera scan triggers;
2. Start scan from business app;
3. target package в нужном профиле;
4. соответствующий intent output, если он используется.

Knox Capture принимает soft trigger только от foreground-приложения. Обязательны
явный package и `PendingIntent`, который используется для проверки отправителя.

### Вариант C — intent output вместо keyboard wedge

Если бизнес-логике нужны symbology, raw bytes и scanner type, Knox Capture может
отправлять результат через Android intent. Администратор настраивает package,
action, category и delivery method; приложение объявляет соответствующую
Activity, foreground service или `BroadcastReceiver`.

Основной extra:

```text
com.samsung.smartscan.scanned_bundle_list
```

В bundle доступны, в частности:

```text
com.samsung.smartscan.unprocessed_raw_data
com.samsung.smartscan.unprocessed_string_data
com.samsung.smartscan.symblogy_type
com.samsung.smartscan.scan_source
com.samsung.smartscan.scanner_type
```

Этот вариант удобнее wedge, когда нужно отличать QR от Code 128, хранить raw
payload или принимать несколько результатов программно. Intent filter следует
делать максимально узким, а входные extras — проверять перед обработкой.

### Вариант D — Knox Capture SDK

SDK нужен, когда приложение должно самостоятельно владеть preview, получать
callback с `BarcodeResult`, управлять scanner UI или реализовывать собственную
нативную scan-логику. Это уже Phase 2: требуется отдельный `.aar`, SDK license и
Camera permission в самом приложении. Для обычного warehouse/retail wedge-flow
переходить к SDK до завершения Phase 1 преждевременно.

## 8. Автоматизированный сбор данных

Проект содержит Linux и Windows PowerShell варианты:

```text
tools/collect-device-info.sh / .ps1
tools/start-capture-log.sh / .ps1
tools/stop-capture-log.sh / .ps1
tools/collect-failure-report.sh / .ps1
tools/parse-device-info.py
tools/compare-runs.py
```

Структура результатов:

```text
results/<UTC-date>/<model>/<run-id>/
```

Для успешного прогона сохранены:

- `device-summary.json` и `device-summary.md`;
- полный `capture-logcat.txt` — 4723 строки;
- filtered logcat — 1300 строк, raw файл не изменён;
- `session.json` и `session.csv`;
- скриншоты настройки и результата.

Сбор baseline не изменяет устройство. Очистка logcat выполняется только явным
запуском `start-log` перед тестом.

## 9. Что тестировать дальше

1. Повторить QR 10 раз и записать success/failure.
2. Проверить Code 128, EAN-13, Data Matrix и PDF417.
3. Отдельно проверить физическую XCover key и Top key.
4. Сравнить Samsung Keyboard, floating button и hardware trigger.
5. Настроить Enter, затем Tab, и проверить переход между полями.
6. Проверить prefix/suffix и basic data formatting.
7. Выполнить 20 попыток на дистанциях 10, 20, 30 и 50 см.
8. Повторить неизменный сценарий на втором классе Samsung Galaxy.
9. Экспортировать профиль и проверить импорт на другое устройство.
10. Только после standalone baseline переходить к trial/commercial license,
    EMM managed configuration и Capture SDK.

## Официальные материалы Samsung

- [Overview: как работает keyboard wedge](https://docs.samsungknox.com/admin/knox-capture/overview/)
- [Scanning profiles](https://docs.samsungknox.com/admin/knox-capture/how-to-guides/create-scanning-profiles/)
- [Apps and activities](https://docs.samsungknox.com/admin/knox-capture/how-to-guides/configure-apps-and-activities/)
- [Scan triggers](https://docs.samsungknox.com/admin/knox-capture/how-to-guides/set-scan-trigger/)
- [Keystroke output and formatting](https://docs.samsungknox.com/admin/knox-capture/how-to-guides/configure-keystroke-output-and-data-formatting/)
- [Soft trigger from a business app](https://docs.samsungknox.com/admin/knox-capture/how-to-guides/start-scan-from-business-app/)
- [Intent output](https://docs.samsungknox.com/admin/knox-capture/how-to-guides/use-intent-output/)
- [Knox Capture SDK](https://docs.samsungknox.com/dev/knox-capture-sdk/)

## Файлы публикации

- [Markdown-версия статьи](article.md)
- [Тестовое приложение Knox Wedge Test](downloads/KnoxWedgeTest-debug.apk)
- [События успешного теста в JSON](results/session.json)
- [События успешного теста в CSV](results/session.csv)
- [Сводка устройства](results/device-summary.md)
