162 lines
4.8 KiB
Dart
162 lines
4.8 KiB
Dart
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<QRCodeScannerScreen> {
|
|
MobileScannerController cameraController = MobileScannerController();
|
|
|
|
bool isScanning = true;
|
|
|
|
@override
|
|
void dispose() {
|
|
cameraController.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
Future<void> _createContactFromVCard(String vCardData) async {
|
|
// Parse VCard data
|
|
final Map<String, dynamic> 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<String, dynamic> _parseVCard(String vCardData) {
|
|
// Simple parser for VCard data
|
|
final Map<String, dynamic> 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<Barcode> 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
|
|
}
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|