import 'package:flutter/material.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; class QRCodeScannerScreen extends StatefulWidget { const QRCodeScannerScreen({Key? key}) : super(key: key); @override _QRCodeScannerScreenState createState() => _QRCodeScannerScreenState(); } class _QRCodeScannerScreenState extends State { MobileScannerController cameraController = MobileScannerController(); bool isScanning = true; @override void dispose() { cameraController.dispose(); super.dispose(); } Future _createContactFromVCard(String vCardData) async { // Parse VCard data final Map contactInfo = _parseVCard(vCardData); debugPrint("contactInfo: $contactInfo"); // // Create a new contact // Contact newContact = Contact(); // // // Set contact's name // newContact.name = Name( // first: contactInfo['firstName'] ?? '', // last: contactInfo['lastName'] ?? '', // ); // // // Set contact's phone numbers // if (contactInfo['phone'] != null) { // newContact.phones = [ // Phone(contactInfo['phone'], label: PhoneLabel.mobile), // ]; // } // // // Set contact's emails // if (contactInfo['email'] != null) { // newContact.emails = [ // Email(contactInfo['email'], label: EmailLabel.home), // ]; // } // // // Request permission to write contacts // bool permission = await FlutterContacts.requestPermission(readonly: false); // if (!permission) { // // Handle permission denied // ScaffoldMessenger.of(context).showSnackBar( // SnackBar(content: Text('Contacts permission denied')), // ); // return; // } // // // Save the contact // await newContact.insert(); } Map _parseVCard(String vCardData) { // Simple parser for VCard data final Map contactInfo = {}; final lines = vCardData.split(RegExp(r'\r?\n')); for (var line in lines) { if (line.startsWith('FN:')) { contactInfo['fullName'] = line.substring(3).trim(); } else if (line.startsWith('N:')) { final names = line.substring(2).split(';'); contactInfo['lastName'] = names[0].trim(); contactInfo['firstName'] = names.length > 1 ? names[1].trim() : ''; } else if (line.startsWith('TEL:')) { contactInfo['phone'] = line.substring(4).trim(); } else if (line.startsWith('EMAIL:')) { contactInfo['email'] = line.substring(6).trim(); } // Add more fields as needed } return contactInfo; } void _showContactAddedDialog() { showDialog( context: context, builder: (context) => AlertDialog( title: Text('Contact Added'), content: Text('The contact has been added to your address book.'), actions: [ TextButton( onPressed: () { Navigator.of(context).pop(); // Close dialog Navigator.of(context).pop(); // Go back to previous screen }, child: Text('OK'), ), ], ), ); } void _showInvalidQRDialog() { showDialog( context: context, builder: (context) => AlertDialog( title: Text('Invalid QR Code'), content: Text('The scanned QR code does not contain valid contact information.'), actions: [ TextButton( onPressed: () { Navigator.of(context).pop(); // Close dialog isScanning = true; // Resume scanning }, child: Text('Try Again'), ), ], ), ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Scan Contact QR Code'), ), body: MobileScanner( controller: cameraController, onDetect: (capture) { if (!isScanning) return; isScanning = false; // Prevent multiple scans final List barcodes = capture.barcodes; for (final barcode in barcodes) { final String? code = barcode.rawValue; if (code != null && code.contains('BEGIN:VCARD')) { // Handle valid vCard QR code _createContactFromVCard(code); _showContactAddedDialog(); // TODO: Be a confirmation button "do you want to add XXX to your contacts?" break; } } if (!barcodes.any((barcode) => barcode.rawValue != null && barcode.rawValue!.contains('BEGIN:VCARD'))) { // If no valid QR code is found _showInvalidQRDialog(); isScanning = true; // Allow scanning again for invalid QR codes } }, ), ); } }