Правило реализации
Рассматривайте ScanManager как аппаратный ресурс с явным владельцем. Откройте его, выберите предполагаемый режим вывода, зарегистрируйте приемник декодирования, проверьте каждую полезную нагрузку, затем отмените регистрацию и детерминированно закройте. Подтвердите поведение метода на образце производственного намерения.
Подготовьте воспроизводимый базовый уровень SDK
Упакуйте одобренный артефакт SDK посредством контролируемого процесса загрузки разработчика. Запишите его версию и SHA-256 вместе со сборкой приложения и записью устройства.
Храните API-интерфейсы поставщиков за адаптером сканера, чтобы бизнес-логику можно было тестировать без аппаратного обеспечения и можно было заменить другую реализацию захвата.
- Только утвержденный источник SDK
- Хеш артефакта записан
- Определена граница адаптера
- Матрица устройств создана
Один раз стать обладателем жизненного цикла сканера
Справочные документы API документируют openScanner, closeScanner, startDecode, stopDecode и функции режима вывода. Решите, будут ли эти вызовы принадлежать действию, службе переднего плана или другому компоненту области приложения.
Избегайте независимого открытия сканера на нескольких экранах. Сделайте остановку и закрытие безопасными для повторения и отображайте ошибочные возвращаемые значения в состоянии диагностики без регистрации полезных данных штрих-кода.
- Один владелец ресурса
- Идемпотентная очистка
- Возвращаемые значения наблюдаются
- Нет полезной нагрузки в обычных логах
Проверка полезной нагрузки широковещательной передачи
Успешная трансляция декодирования может включать в себя необработанные данные, декодированную строку, длину и тип штрих-кода. Прежде чем доставлять событие домена, проверьте действие, допустимость значений NULL и длину.
Выберите одно авторитетное представление. Если кодировка имеет значение, сохраняйте необработанные байты и декодируйте их с использованием явной кодировки вместо того, чтобы предполагать, что каждый штрих-код представляет собой простой ASCII.
- Действие точно соответствует
- Длина соответствует полезной нагрузке
- Политика кодирования документирована
- Дублирующая защита событий
Переход от демонстрации к доказательствам
Успех компиляции подтверждает только совместимость исходного кода. Запустите приложение на каждой предполагаемой модели, ОС и прошивке с репрезентативными метками и сценариями жизненного цикла.
Запишите настройки сканера и режим вывода после настройки. Регрессионный тест после изменения прошивки, SDK, приложения или политики MDM.
- Репрезентативный корпус сканирования
- Циклы сна и возобновления
- Случаи быстрого и длинного кода
- Версионная тестовая запись
Карта состояний жизненного цикла ScanManager
Обеспечьте соответствие вызовов ресурсов наблюдаемому состоянию приложения.
| Государство | Требуемое действие | Реакция на отказ |
|---|---|---|
| Начало | Создайте ScanManager и откройте сканер. | Блокировать захват и показывать диагностическое состояние |
| Готово | Установите режим вывода и зарегистрируйте приемник | Прочтите или сообщите об ошибке конфигурации. |
| Захват | Начать декодирование или принять триггерные события | Тайм-аут, остановка и разрешение контролируемой повторной попытки |
| Приостановлено | Остановить декодирование и отменить регистрацию, как задумано. | Запретить доставку в неактивный рабочий процесс |
| Разрушен | Закройте сканер один раз | Запишите результат очистки без конфиденциальных данных |
Пример Kotlin с минимальным жизненным циклом
Проверьте константы режима вывода, флаги получателя Android и владение жизненным циклом на соответствие точному SDK, целевому API и архитектуре приложения.
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.device.ScanManager
import androidx.appcompat.app.AppCompatActivity
class UrovoScannerActivity : AppCompatActivity() {
private val scanner = ScanManager()
private var receiverRegistered = false
private val decodeReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action != ScanManager.ACTION_DECODE) return
val raw = intent.getByteArrayExtra(ScanManager.DECODE_DATA_TAG) ?: return
val declaredLength = intent.getIntExtra(ScanManager.BARCODE_LENGTH_TAG, raw.size)
val type = intent.getByteExtra(ScanManager.BARCODE_TYPE_TAG, 0)
val value = intent.getStringExtra(ScanManager.BARCODE_STRING_TAG)
?: raw.copyOf(declaredLength.coerceIn(0, raw.size)).toString(Charsets.UTF_8)
onValidatedScan(value, type)
}
}
override fun onStart() {
super.onStart()
check(scanner.openScanner()) { "Scanner could not be opened" }
// Confirm the broadcast-output constant in the SDK version you ship.
check(scanner.switchOutputMode(0)) { "Output mode could not be set" }
registerReceiver(decodeReceiver, IntentFilter(ScanManager.ACTION_DECODE))
receiverRegistered = true
}
override fun onStop() {
scanner.stopDecode()
if (receiverRegistered) unregisterReceiver(decodeReceiver)
receiverRegistered = false
scanner.closeScanner()
super.onStop()
}
private fun onValidatedScan(value: String, type: Byte) {
// Route a sanitized domain event; do not log sensitive barcode values.
}
}Контрольный список проверки ScanManager
Прикрепите эту запись к утвержденному базовому состоянию приложения и устройства.
- 01
Версия SDK и SHA-256 записаны
- 02
Устройство SKU, записанная ОС и прошивка
- 03
Сканер неоднократно открывается и закрывается
- 04
Режим вывода прочитан или подтвержден
- 05
Жизненный цикл получателя соответствует активному пользовательскому интерфейсу
- 06
Проверены дополнительные параметры необработанных данных, строк, длины и типа.
- 07
Все необходимые символы проверены
- 08
Проверено длительное, поврежденное и быстрое сканирование
- 09
Спящий режим, перезагрузка и режим киоска MDM протестированы.
- 10
Конфиденциальные данные штрих-кода не сохраняются
Часто задаваемые вопросы
Что означает переключательOutputMode(0)?
В справочном документе API описано переключение режима вывода, но константы и поведение необходимо проверять в конкретной версии SDK и встроенном ПО устройства. Не копируйте константу выборки в производство без проверки.
Должен ли сканер закрываться в режиме onPause или onStop?
Выберите владение жизненным циклом в зависимости от архитектуры приложения и возможности продолжения сканирования при частичном скрытии. Важным требованием является один владелец, детерминированная очистка и проверенное поведение.
Можно ли использовать этот образец на каждом устройстве UROVO ?
Нет. Это схема проверки, основанная на ScanManager v4.1.0326. Скомпилируйте и запустите его на каждой предполагаемой модели, ОС и прошивке перед выпуском.
Доказательства и ограничения
SDK — образец, основанный на ссылке / не проверенный для каждой целевой конфигурации
Код носит иллюстративный характер и намеренно вызывает константы, специфичные для версии, и политику приемника Android для проверки.
Рассмотрено: 2026-08-10
- UROVO Android SDK v4.1.0326 Ссылка на ScanManager API
- UROVO Пример проекта ScanManager в утвержденном экспорте SDK
- Android документация по жизненному циклу приложения и приемника вещания

