Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. Flutter 3.x ve üzeri sürümler, performans iyileştirmeleri ve güvenlik yamalarıyla güncel mobil uygulamalar için en stabil ortamı sunar. Aşağıdaki araçların yüklü olduğunu kontrol edin:
- Flutter SDK (3.22 veya üzeri önerilir)
- Dart SDK (3.5 veya üzeri)
- Android Studio veya VS Code (Gerekli eklentilerle birlikte)
- Fiziksel bir test cihazı (Kamera simülasyonu emülatörlerde kısıtlıdır)
Projenizi oluşturmak için terminalinize flutter create qr_scanner_app komutunu yazarak başlayabilirsiniz. Ardından, pubspec.yaml dosyanıza gerekli bağımlılıkları ekleyeceğiz.
Gerekli Paketlerin Kurulumu
Flutter ekosisteminde QR okuma işlemleri için en performanslı ve güncel kütüphane mobile_scanner paketidir. Bu paket, kamera erişimini ve görüntü işleme süreçlerini optimize edilmiş şekilde yönetir. Bağımlılıkları projenize eklemek için aşağıdaki adımları izleyin.
dependencies:
flutter:
sdk: flutter
mobile_scanner: ^6.0.0
Paketi ekledikten sonra terminalde flutter pub get komutunu çalıştırarak kütüphaneyi projenize dahil edin. Bu kütüphane, hem iOS hem de Android için gerekli olan kamera izinlerini yönetmenize olanak tanır.
Platform İzinlerinin Ayarlanması
Mobil uygulamalarda kamera kullanımı hassas bir izne tabidir. Kullanıcıdan izin almadan kameraya erişmeye çalışmak, uygulamanın çökmesine veya mağaza reddine neden olur. Android ve iOS için gerekli yapılandırmaları aşağıda bulabilirsiniz.
Android için: android/app/src/main/AndroidManifest.xml dosyasına şu satırı ekleyin:
iOS için: ios/Runner/Info.plist dosyasına şu anahtarı ekleyerek kullanıcıyı bilgilendirin:
NSCameraUsageDescription
QR kodları tarayabilmek için kameranıza erişmemiz gerekiyor.
QR Tarayıcı Arayüzünü Oluşturma
Şimdi lib/main.dart dosyasında tarayıcı ekranımızı tasarlayalım. MobileScanner widget'ı, kameradan gelen görüntüyü anlık olarak işler ve onDetect metodu ile sonucu bize döndürür. Bu adımda, tarama sonucunu yakalayan temel yapıyı kuruyoruz.
import 'package:flutter/material.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
class QrScannerScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("QR Kod Okuyucu")),
body: MobileScanner(
onDetect: (capture) {
final List barcodes = capture.barcodes;
for (final barcode in barcodes) {
debugPrint('Bulunan Kod: ${barcode.rawValue}');
}
},
),
);
}
}
Bu kod bloğu, kamerayı açar ve her başarılı taramada konsola veriyi yazdırır. barcode.rawValue değişkeni, QR kodun içindeki metin veya URL bilgisini taşır.
Veri İşleme ve Hata Yönetimi
Kullanıcıya sadece veriyi konsolda göstermek yeterli değildir. Tarama sonucunda elde edilen verinin bir URL olup olmadığını kontrol etmek ve kullanıcıyı yönlendirmek daha profesyonel bir yaklaşımdır. Ayrıca, tarama esnasında oluşabilecek hataları yönetmek için errorBuilder kullanmalısınız.
MobileScanner(
errorBuilder: (context, error, child) {
return Center(child: Text("Kamera erişimi sağlanamadı: ${error.errorCode}"));
},
onDetect: (capture) {
final String? data = capture.barcodes.first.rawValue;
if (data != null) {
// Burada veriyi işleyin, örneğin bir sayfaya yönlendirin
print("Taranan Veri: $data");
}
},
);
Bu yapı, uygulamanın kamera hatası durumunda çökmesini engeller ve kullanıcıya anlamlı bir hata mesajı gösterir.
QR Kod Okuyucu Yöntemlerinin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| MobileScanner | Hızlı, güncel, düşük bellek kullanımı | Daha fazla yapılandırma gerektirir |
| QR_Code_Scanner | Eski ve geniş topluluk desteği | Güncellemeleri yavaş, bazı sürümlerde hata verir |
Güvenlik Uyarısı: QR kodlar üzerinden gelen veriler her zaman güvenli olmayabilir. Bir URL'yi doğrudan tarayıcıda açmadan önce mutlaka bir doğrulama (validation) sürecinden geçirin. Kötü niyetli kişilerin hazırladığı QR kodlar, kullanıcıyı sahte web sitelerine yönlendirebilir.
Sıkça Sorulan Sorular
QR kod okuyucu uygulaması neden kamerayı açmıyor?
Genellikle AndroidManifest.xml veya Info.plist dosyalarındaki izinlerin eksik olmasından kaynaklanır. Ayrıca emülatör kullanıyorsanız, emülatörün kamera ayarlarının "Emulated" veya "Webcam" olarak seçildiğinden emin olun.
Taranan veriyi nasıl bir web sitesine yönlendirebilirim?
url_launcher paketini kullanarak, onDetect içerisinde gelen veriyi launchUrl(Uri.parse(data)) metodu ile tarayıcıda açabilirsiniz.
Uygulama arka planda çalışırken tarama devam eder mi?
Hayır, pil tasarrufu ve güvenlik nedeniyle uygulama arka plana alındığında kamera erişimi otomatik olarak kesilir. Uygulama tekrar ön plana geldiğinde kamerayı yeniden başlatmanız gerekebilir.
QR kod okuma hızı nasıl artırılır?
MobileScanner içindeki scanWindow parametresini kullanarak tarama alanını ekranın belirli bir bölümüyle sınırlayabilir, böylece işlemci üzerindeki yükü azaltabilirsiniz.
Karanlık ortamlarda tarama yapmak için ne yapmalıyım?
MobileScanner controller'ı üzerinden controller.toggleTorch() metodunu kullanarak cihazın flaş ışığını kontrol edebilirsiniz.
Uygulama Performansını Optimize Etme ve İleri Seviye İpuçları
QR kod okuyucu uygulamanızın kullanıcı deneyimini iyileştirmek için sadece çalışması yeterli değildir; aynı zamanda hızlı ve enerji verimli olması gerekir. Kamera akışları yüksek kaynak tüketimine neden olabilir. Performansı artırmak için aşağıdaki stratejileri uygulayabilirsiniz:
- Kamera Çözünürlüğünü Sınırlandırma: Yüksek çözünürlüklü kamera akışları işlemciyi yorar. QR kod okuma için 720p veya daha düşük bir çözünürlük genellikle yeterlidir.
- Tarama Frekansını Ayarlama: Her kareyi (frame) işlemek yerine, saniyede belirli sayıda (örneğin 5-10 kare) analiz yaparak CPU kullanımını düşürebilirsiniz.
- Gereksiz Paketlerden Kaçınma: Uygulamanızda sadece QR okuma işlevine odaklanın. Arka planda çalışan ağır servisleri tarama anında durdurun.
Özel QR Kod Arayüzü (Overlay) Tasarımı
Kullanıcıların QR kodu doğru hizalaması için bir "tarama çerçevesi" eklemek, uygulamanın profesyonel görünmesini sağlar. Stack widget'ını kullanarak kamera görüntüsünün üzerine yarı saydam bir katman ekleyebilirsiniz.
Stack(
children: [
QRView(key: qrKey, onQRViewCreated: _onQRViewCreated),
Container(
decoration: BoxDecoration(
color: Colors.black.withOpacity(0.5),
),
child: Center(
child: Container(
width: 250,
height: 250,
decoration: BoxDecoration(
border: Border.all(color: Colors.green, width: 4),
borderRadius: BorderRadius.circular(12),
),
),
),
),
],
)
Uygulamayı Yayına Hazırlama (Deployment) ve Test Süreçleri
Uygulamanızı mağazalara göndermeden önce farklı cihazlarda test etmek hayati önem taşır. Özellikle düşük bütçeli Android cihazların kamera odaklama (auto-focus) yetenekleri farklılık gösterebilir.
Farklı Cihazlarda Test Stratejileri
- Fiziksel Cihaz Testi: QR kod okuma simülatörlerde sağlıklı çalışmaz. Mutlaka en az bir düşük segment ve bir yüksek segment fiziksel cihazda test yapın.
- İzin Yönetimi Testi: Kullanıcı kameraya erişim izni vermediğinde uygulamanın çökmediğinden, aksine kullanıcıyı ayarlar menüsüne yönlendiren bir uyarı gösterdiğinden emin olun.
- Kamera İzinleri (iOS/Android):
Info.plist(iOS) veAndroidManifest.xml(Android) dosyalarınızdaki izin açıklamalarının net olduğundan emin olun; aksi takdirde Apple mağaza reddi verebilir.
Pro İpucu: Uygulamanızın üretim sürümünü alırken flutter build apk --split-per-abi komutunu kullanarak APK boyutunu optimize edebilir, böylece kullanıcılarınızın daha hızlı indirme yapmasını sağlayabilirsiniz.
Hata Ayıklama (Debugging) İçin İpuçları
Eğer tarama işlemi başlamıyorsa, konsolunuzda CameraAccessDenied hatası alıp almadığınızı kontrol edin. Ayrıca, onQRViewCreated metodu içerisinde controller.resumeCamera() çağrısının yapıldığından emin olun. Uygulama arka plana geçtiğinde kamerayı serbest bırakmak (dispose) bellek sızıntılarını önlemek için zorunludur.
Sonuç
Flutter ile QR kod okuyucu geliştirmek, modern mobil geliştirme araçlarının ne kadar güçlü olduğunu gösteren harika bir örnektir. Bu rehberde, kamera izinlerinden başlayarak, veriyi yakalama ve hata yönetimine kadar olan süreci adım adım inceledik. Bir sonraki adım olarak, taranan verileri yerel veritabanında (SQLite veya Hive) saklayarak bir "Tarama Geçmişi" özelliği eklemeyi deneyebilirsiniz.
Kod Güvenliği Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamına (production) alacağınız uygulamalarda, kullanıcı girdilerini filtrelemeyi, ağ isteklerini SSL ile şifrelemeyi ve uygulama içi güvenlik katmanlarını (örneğin: jailbreak/root tespiti) mutlaka uygulayınız.


Yorumlar (0)
Yorum Yaz