diff --git a/lib/app_version.dart b/lib/app_version.dart index c5fffa0..66564b8 100644 --- a/lib/app_version.dart +++ b/lib/app_version.dart @@ -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.0+1'; +const String kAppVersion = '0.1.1+2'; diff --git a/lib/screens/login_screen.dart b/lib/screens/login_screen.dart index 9a76611..6cbb63a 100644 --- a/lib/screens/login_screen.dart +++ b/lib/screens/login_screen.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:nfc_manager/nfc_manager.dart'; +import 'package:nfc_manager/nfc_manager_android.dart'; import '../app_version.dart'; import '../models/kiosk_session.dart'; import '../services/api_client.dart'; @@ -66,9 +67,9 @@ class _LoginScreenState extends State { } Future _startNfcScan() async { - final available = await NfcManager.instance.isAvailable(); - if (!available) { - setState(() => _error = 'NFC ist auf diesem Gerät nicht verfügbar.'); + final availability = await NfcManager.instance.checkAvailability(); + if (availability != NfcAvailability.enabled) { + setState(() => _error = 'NFC ist nicht verfügbar oder deaktiviert (Status: ${availability.name}).'); return; } setState(() { @@ -78,6 +79,7 @@ class _LoginScreenState extends State { }); try { await NfcManager.instance.startSession( + pollingOptions: {NfcPollingOption.iso14443, NfcPollingOption.iso15693, NfcPollingOption.iso18092}, onDiscovered: (NfcTag tag) async { final uid = _extractUid(tag); await NfcManager.instance.stopSession(); @@ -99,15 +101,12 @@ class _LoginScreenState extends State { } } + /// Android-spezifisch (siehe nfc_manager 4.x: NfcTagAndroid.from(tag).id). + /// Nur Android relevant – Kiosk-Tablets, kein iOS-Support geplant. String? _extractUid(NfcTag tag) { - for (final key in ['nfca', 'nfcb', 'nfcf', 'nfcv', 'mifareclassic', 'mifareultralight', 'isodep']) { - final techData = tag.data[key]; - if (techData is Map && techData['identifier'] != null) { - final bytes = (techData['identifier'] as List).cast(); - return bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join().toUpperCase(); - } - } - return null; + final androidTag = NfcTagAndroid.from(tag); + if (androidTag == null) return null; + return androidTag.id.map((b) => b.toRadixString(16).padLeft(2, '0')).join().toUpperCase(); } Future _submitNfc() async { diff --git a/pubspec.yaml b/pubspec.yaml index 349313b..ede7c91 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: timemaster_kiosk description: TimeMaster Kiosk – Stempeluhr für Android-Tablets hinter VPN publish_to: 'none' -version: 0.1.0+1 +version: 0.1.1+2 environment: sdk: '>=3.3.0 <4.0.0' @@ -12,7 +12,7 @@ dependencies: cupertino_icons: ^1.0.8 dio: ^5.7.0 flutter_secure_storage: ^9.2.2 - nfc_manager: ^3.5.0 + nfc_manager: ^4.2.1 dev_dependencies: flutter_test: