fix(qr-scan): feste Kamera-Auflösung + Retry gegen genericError auf günstiger Hardware

Auf T10-Pro-Tablet (und vermutlich ähnlicher Budget-Hardware) lieferte
CameraX bei Auto-Auflösung nur "MobileScannerErrorCode.genericError" ohne
brauchbare Details – die Kamera-HAL kommt mit der von CameraX gewählten
Default-Auflösung nicht klar. Fix: MobileScannerController jetzt mit fester
cameraResolution (1280x720) + formats: [qrCode] (weniger Codec-Last als
Auto-Erkennung aller Formate). Neuer "Mit niedrigerer Auflösung erneut
versuchen"-Button im Fehler-Screen (fällt auf 640x480 zurück) als
zusätzlicher Recovery-Pfad, falls 720p immer noch scheitert.

v0.1.8+9.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
This commit is contained in:
patrickandClaude Sonnet 5 committed 2026-09-10 14:15:34 +02:00
1 parent 7b0f0fe1fc
commit 1e05f7b929
3 files changed
+28 -3

No files matched your search

+1 -1
View File
@@ -1,3 +1,3 @@
/// Manuell mit pubspec.yaml synchron halten (siehe timemaster-mobile,
/// gleiche Konvention – kein package_info_plus während aktiver Feldtests).
const String kAppVersion = '0.1.7+8';
const String kAppVersion = '0.1.8+9';
+26 -1
View File
@@ -12,7 +12,17 @@ class QrEnrollmentScanScreen extends StatefulWidget {
}
class _QrEnrollmentScanScreenState extends State<QrEnrollmentScanScreen> {
final _controller = MobileScannerController();
// Feste, niedrige Auflösung + nur QR-Format: manche günstigen Android-
// Tablets (z.B. T10 Pro) liefern bei CameraX-Auto-Auflösung nur
// "MobileScannerErrorCode.genericError" ohne Details – die HAL kommt mit
// der von CameraX gewählten Default-Auflösung nicht klar. 1280x720 ist
// breit unterstützt und für QR-Codes mehr als ausreichend.
MobileScannerController _buildController() => MobileScannerController(
formats: const [BarcodeFormat.qrCode],
cameraResolution: const Size(1280, 720),
);
late MobileScannerController _controller = _buildController();
bool _handled = false;
String? _error;
@@ -22,6 +32,16 @@ class _QrEnrollmentScanScreenState extends State<QrEnrollmentScanScreen> {
super.dispose();
}
Future<void> _retryWithLowerResolution() async {
await _controller.dispose();
setState(() {
_controller = MobileScannerController(
formats: const [BarcodeFormat.qrCode],
cameraResolution: const Size(640, 480),
);
});
}
void _onDetect(BarcodeCapture capture) {
if (_handled) return;
final raw = capture.barcodes.firstOrNull?.rawValue;
@@ -72,6 +92,11 @@ class _QrEnrollmentScanScreenState extends State<QrEnrollmentScanScreen> {
style: const TextStyle(color: Colors.white70, fontSize: 12),
textAlign: TextAlign.center),
const SizedBox(height: 24),
OutlinedButton(
onPressed: _retryWithLowerResolution,
child: const Text('Mit niedrigerer Auflösung erneut versuchen', style: TextStyle(color: Colors.white)),
),
const SizedBox(height: 8),
OutlinedButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('Zurück – manuell eintragen', style: TextStyle(color: Colors.white)),
+1 -1
View File
@@ -1,7 +1,7 @@
name: timemaster_kiosk
description: TimeMaster Kiosk – Stempeluhr für Android-Tablets hinter VPN
publish_to: 'none'
version: 0.1.7+8
version: 0.1.8+9
environment:
sdk: '>=3.3.0 <4.0.0'