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:
1 parent
7b0f0fe1fc
commit
1e05f7b929
3 files changed
+28
-3
No files matched your search
@@ -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';
|
||||
@@ -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
@@ -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'
|
||||
|
||||
Reference in new issue
Block a user