Zasada wdrożenia
Traktuj ScanManager jako zasób sprzętowy mający wyraźnego właściciela. Otwórz go, wybierz zamierzony tryb wyjściowy, zarejestruj odbiornik dekodowania, zweryfikuj każdy ładunek, a następnie wyrejestruj i zamknij deterministycznie. Potwierdź zachowanie metody na próbce przeznaczonej do produkcji.
Przygotuj powtarzalną SDK linię bazową
Spakuj zatwierdzony artefakt SDK w ramach kontrolowanego procesu pobierania przez programistę. Zapisz jego wersję i SHA-256 wraz z kompilacją aplikacji i rekordem urządzenia.
Zachowaj interfejsy API dostawcy za adapterem skanera, aby można było testować logikę biznesową bez sprzętu i zastąpić inną implementację przechwytywania.
- Tylko zatwierdzone źródło SDK.
- Zarejestrowano skrót artefaktu
- Zdefiniowano granicę adaptera
- Utworzono matrycę urządzeń
Posiadaj raz cykl życia skanera
Referencja API dokumentuje funkcje openScanner, CloseScanner, startDecode, stopDecode i funkcje trybu wyjściowego. Zdecyduj, czy działanie, usługa na pierwszym planie lub inny komponent o zasięgu aplikacji jest właścicielem tych wywołań.
Unikaj niezależnego otwierania skanera na wielu ekranach. Zapewnij bezpieczne powtarzanie wartości zatrzymania i zamknięcia oraz wynurzanie wartości zwracanych w stanie diagnostycznym bez rejestrowania ładunków z kodem kreskowym.
- Pojedynczy właściciel zasobu
- Idempotentne czyszczenie
- Zaobserwowane wartości zwracane
- Brak ładunków w zwykłych dziennikach
Sprawdź ładunek rozgłoszeniowy
Pomyślna transmisja dekodowania może obejmować nieprzetworzone dane, zdekodowany ciąg znaków, długość i typ kodu kreskowego. Przed dostarczeniem zdarzenia domeny sprawdź działanie, dopuszczalność wartości null i długość.
Wybierz jedną wiarygodną reprezentację. Jeśli kodowanie ma znaczenie, zachowaj surowe bajty i dekoduj przy użyciu jawnego zestawu znaków, zamiast zakładać, że każdy kod kreskowy jest prostym kodem ASCII.
- Akcja dokładnie pasuje
- Długość zgodna z ładownością
- Udokumentowana polityka kodowania
- Zduplikowany strażnik zdarzeń
Przejdź od wersji demonstracyjnej do dowodów produkcyjnych
Sukces kompilacji dowodzi jedynie zgodności źródła. Uruchom aplikację na każdym zamierzonym modelu, systemie operacyjnym i oprogramowaniu sprzętowym, korzystając z reprezentatywnych etykiet i scenariuszy cyklu życia.
Zapisz ustawienia skanera i tryb wyjściowy po konfiguracji. Test regresji po zmianach oprogramowania sprzętowego, SDK, aplikacji lub MDM zasad.
- Reprezentatywny korpus skanów
- Uśpij i wznów cykle
- Przypadki szybkiego i długiego kodu
- Wersjonowany zapis testu
Mapa stanu cyklu życia programu ScanManager
Utrzymuj wywołania zasobów dostosowane do obserwowalnego stanu aplikacji.
| Stan | Wymagane działanie | Reakcja na awarię |
|---|---|---|
| Rozpoczęcie | Utwórz ScanManager i otwórz skaner | Zablokuj przechwytywanie i pokaż stan diagnostyczny |
| Gotowy | Ustaw tryb wyjścia i zarejestruj odbiorcę | Przeczytaj ponownie lub zgłoś błąd konfiguracji |
| Przechwytywanie | Rozpocznij dekodowanie lub zaakceptuj zdarzenia wyzwalające | Przekrocz limit czasu, zatrzymaj i zezwól na kontrolowaną ponowną próbę |
| Wstrzymano | Zatrzymaj dekodowanie i wyrejestruj się zgodnie z przeznaczeniem | Zapobiegaj dostarczaniu do nieaktywnego przepływu pracy |
| Zniszczony | Zamknij skaner raz | Zapisz wynik czyszczenia bez wrażliwych danych |
Przykład uwzględniający minimalny cykl życia Kotlin.
Sprawdź stałe trybu wyjściowego, Android flagi odbiornika i własność cyklu życia pod kątem dokładnej SDK, docelowej API i architektury aplikacji.
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.
}
}Lista kontrolna sprawdzania poprawności programu ScanManager
Dołącz ten rekord do zatwierdzonej aplikacji i linii bazowej urządzenia.
- 01
Zarejestrowano wersję SDK i SHA-256
- 02
Zapisano urządzenie SKU, system operacyjny i oprogramowanie sprzętowe
- 03
Skaner wielokrotnie się otwiera i zamyka
- 04
Tryb wyjścia odczytany lub potwierdzony
- 05
Cykl życia odbiornika odpowiada aktywnemu interfejsowi użytkownika
- 06
Sprawdzono surowiec, sznurek, długość i dodatki typu
- 07
Przetestowano wszystkie wymagane symboliki
- 08
Testowano długie, uszkodzone i szybkie skany
- 09
Przetestowano tryb uśpienia, ponownego uruchomienia i MDM trybu kiosku
- 10
Nie zarejestrowano żadnych wrażliwych danych kodu kreskowego
Często zadawane pytania
Co oznacza switchOutputMode(0)?
Dokument API dokumentuje przełączanie trybu wyjściowego, ale stałe i zachowanie należy sprawdzić dokładnie w wersji SDK i oprogramowaniu sprzętowym urządzenia. Nie kopiuj stałej próbki do produkcji bez weryfikacji.
Czy skaner powinien zamknąć się w trybie onPause czy onStop?
Wybierz własność cyklu życia w oparciu o architekturę aplikacji i to, czy skanowanie może być kontynuowane, gdy jest częściowo zasłonięte. Ważnym wymaganiem jest jeden właściciel, deterministyczne czyszczenie i sprawdzone zachowanie.
Czy tego przykładu można używać na każdym urządzeniu UROVO ?
Nie. Jest to schemat walidacji oparty na ScanManager v4.1.0326. Skompiluj i uruchom go na każdym docelowym modelu, systemie operacyjnym i oprogramowaniu sprzętowym przed wydaniem.
Dowody i ograniczenia
SDK – próbka oparta na referencjach/nie została sprawdzona w każdej konfiguracji docelowej
Kod ma charakter ilustracyjny i celowo wywołuje stałe specyficzne dla wersji oraz politykę odbiorcy Android w celu weryfikacji.
Recenzję: 2026-08-10
- UROVO Android SDK v4.1.0326 ScanManager API odniesienie
- UROVO Przykładowy projekt ScanManager w zatwierdzonym eksporcie SDK
- Android dokumentacja cyklu życia aplikacji i odbiornika rozgłoszeniowego

