Gereksinimler ve Ön Hazırlık
Kamera erişimi, hem Android hem de iOS platformlarında "hassas izinler" kategorisine girer. Bu nedenle, projenizi yapılandırmadan önce gerekli bağımlılıkları eklemeli ve işletim sistemi seviyesindeki konfigürasyonları tamamlamalısınız. 2026 yılı itibarıyla güncel ve kararlı olan camera paketini kullanacağız.
Öncelikle, pubspec.yaml dosyanıza aşağıdaki bağımlılığı ekleyin:
dependencies:
flutter:
sdk: flutter
camera: ^0.11.0
path_provider: ^2.1.0
Bu paketler, kamera donanımını kontrol etmek ve çekilen görüntüleri cihazın yerel depolama alanına kaydetmek için gereklidir. Kurulumdan sonra terminalde flutter pub get komutunu çalıştırarak paketleri projenize dahil edin.
Platform İzinlerinin Yapılandırılması
Kameraya erişmek için uygulama manifest dosyalarında gerekli izinleri tanımlamanız şarttır. Aksi takdirde, uygulama çalışma zamanında (runtime) hata verecek ve kapanacaktır.
Android için android/app/src/main/AndroidManifest.xml dosyasına şu satırları ekleyin:
iOS tarafında ise ios/Runner/Info.plist dosyasına şu anahtarları eklemeyi unutmayın:
NSCameraUsageDescription
Profil fotoğrafı güncellemek için kameraya erişmemiz gerekiyor.
Kamera Denetleyicisini Başlatma
Kamerayı kullanmadan önce cihazdaki mevcut kameraları listeleyip bir CameraController nesnesi oluşturmalısınız. Bu nesne, kamera akışını yöneten temel mekanizmadır.
Future initializeCamera() async {
final cameras = await availableCameras();
final firstCamera = cameras.first;
_controller = CameraController(
firstCamera,
ResolutionPreset.medium,
);
await _controller.initialize();
}
Burada ResolutionPreset.medium seçimi, performans ve kalite arasında dengeli bir tercih yapmanızı sağlar. Uygulamanızın ihtiyacına göre high veya ultraHigh seçeneklerini de değerlendirebilirsiniz.
Kamera Önizlemesini Ekrana Yansıtma
Kamera akışını kullanıcıya göstermek için CameraPreview widget'ı kullanılır. Bu widget, CameraController ile senkronize çalışır ve canlı görüntüyü arayüzde render eder.
@override
Widget build(BuildContext context) {
if (!_controller.value.isInitialized) {
return Container();
}
return AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: CameraPreview(_controller),
);
}
AspectRatio kullanımı, kamera görüntüsünün ekranda bozulmadan (stretch olmadan) doğru oranda görünmesini sağlar. Bu, profesyonel bir kullanıcı arayüzü için kritik bir detaydır.
Fotoğraf Çekme ve Kaydetme
Kamera akışı hazır olduğunda, takePicture metodunu kullanarak bir fotoğraf çekebilir ve bunu bir dosya olarak kaydedebilirsiniz.
Future takePhoto() async {
try {
final image = await _controller.takePicture();
print("Fotoğraf şuraya kaydedildi: ${image.path}");
} catch (e) {
print("Hata oluştu: $e");
}
}
Bu işlem asenkron çalışır. Dosya yolu (path) üzerinden görseli bir Image.file widget'ı ile uygulamanızın başka bir ekranında gösterebilir veya bir API üzerinden sunucuya yükleyebilirsiniz.
Kamera Yöntemlerinin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Camera Paketi | Tam kontrol, özelleştirilebilir arayüz | Daha karmaşık yapılandırma |
| Image Picker | Hızlı kurulum, basit kullanım | Arayüz özelleştirilemez |
Eğer sadece basit bir fotoğraf seçimi yapacaksanız image_picker paketi yeterlidir. Ancak özel bir kamera arayüzü (örneğin üzerine çerçeve eklenmiş bir kimlik tarayıcı) tasarlıyorsanız camera paketi tek seçenektir.
Güvenlik Uyarısı: Kullanıcıdan alınan görselleri sunucuya yüklemeden önce mutlaka dosya boyutu ve türü (MIME type) kontrolü yapın. Doğrudan kullanıcıdan gelen dosyaları sunucuda çalıştırmayın; bu durum XSS ve zararlı yazılım enjeksiyonuna davetiye çıkarabilir.
Sıkça Sorulan Sorular
Kamera neden siyah ekran gösteriyor?
Kamera denetleyicisi başlatılmadan (initialize) önce CameraPreview widget'ı ekrana gelirse siyah ekran alırsınız. FutureBuilder kullanarak başlatma işleminin tamamlanmasını bekleyin.
Fiziksel cihazda izin hatası alıyorum, ne yapmalıyım?
Manifest dosyalarındaki izinlerin doğru yazıldığından ve cihaz ayarlarından uygulamaya kamera izni verildiğinden emin olun. Bazen uygulamayı tamamen silip yeniden yüklemek izin önbelleğini temizler.
Hangi çözünürlüğü seçmeliyim?
Düşük cihazlarda ResolutionPreset.low veya medium tercih edin. Çok yüksek çözünürlük, bellek (RAM) tüketimini artırarak uygulamanın çökmesine neden olabilir.
Ön ve arka kamera arasında nasıl geçiş yaparım?
availableCameras() fonksiyonundan dönen listenin indekslerini değiştirerek farklı bir kamera sensörünü CameraController'a atayabilirsiniz.
Kamera akışı pil tüketimini etkiler mi?
Evet, kamera donanımı sürekli çalışır durumda olduğunda pil tüketimi artar. Uygulamanızın onDispose metodunda _controller.dispose() yaparak kamerayı serbest bıraktığınızdan emin olun.
Kamera Uygulamalarında Performans Optimizasyonu ve Bellek Yönetimi
Kamera erişimi sağlayan uygulamalar, sürekli bir veri akışı (stream) ile çalıştıkları için yüksek bellek ve işlemci gücü tüketirler. Özellikle düşük donanımlı cihazlarda uygulamanın donmasını veya çökmesini engellemek için bazı kritik optimizasyon tekniklerini uygulamak zorundasınız.
Kare Hızı (Frame Rate) Kontrolü
Kamera akışını sürekli yüksek çözünürlükte ve yüksek kare hızında (FPS) tutmak, pil tüketimini doğrudan artırır. Eğer uygulamanızda sadece bir önizleme gösteriyorsanız, resolutionPreset değerini ResolutionPreset.low veya medium seviyesinde tutmak performansı ciddi oranda artıracaktır.
Bellek Sızıntılarını Önleme
Kamera denetleyicisi (CameraController) nesnesi, uygulama yaşam döngüsü boyunca doğru yönetilmelidir. Özellikle StatefulWidget içerisinde dispose metodunu atlamak, uygulamanın arka planda kamerayı tutmaya devam etmesine ve bellek sızıntılarına yol açar.
@override
void dispose() {
// Kamera kaynaklarını serbest bırak
_controller.dispose();
super.dispose();
}
Kamera Uygulamaları İçin İleri Seviye Hata Ayıklama İpuçları
Kamera ile çalışırken karşılaşılan hataların çoğu, donanım izinleri veya desteklenmeyen çözünürlük ayarlarından kaynaklanır. Geliştirme sürecinde bu sorunları hızlıca çözmek için aşağıdaki stratejileri izleyebilirsiniz.
Donanım Destek Kontrolü
Her cihazın kamera yetenekleri farklıdır. Bazı cihazlar belirli çözünürlükleri desteklemezken, bazıları otomatik odaklama (autofocus) özelliğine sahip değildir. Uygulamanızın çökmesini önlemek için kamera başlatma işlemini bir try-catch bloğu ile sarmalamanız şarttır.
Future initializeCamera() async {
try {
await _controller.initialize();
} on CameraException catch (e) {
switch (e.code) {
case 'CameraAccessDenied':
print('Kullanıcı kamera iznini reddetti.');
break;
default:
print('Kamera hatası: ${e.description}');
break;
}
}
}
Kamera Akışında Görüntü İşleme (Image Stream)
Eğer kamera görüntüsünü canlı olarak analiz etmeniz gerekiyorsa (örneğin bir barkod okuyucu veya yüz tanıma sistemi), startImageStream metodunu kullanabilirsiniz. Ancak bu metodun çok yoğun bir işlem yükü oluşturduğunu unutmayın.
- İşlem Yükü: Görüntü işleme mantığını ana UI thread'inden ayırarak
computefonksiyonu veyaIsolatekullanarak arka planda çalıştırın. - Örnekleme: Her kareyi işlemek yerine, örneğin her 5 veya 10 karede bir analiz yaparak işlemci üzerindeki yükü %80'e kadar azaltabilirsiniz.
Bu optimizasyonlar, özellikle uzun süreli kamera kullanımı gerektiren (örneğin güvenlik veya doküman tarama uygulamaları) projelerde kullanıcı deneyimini doğrudan etkileyen en önemli faktörlerdir.
Sonuç
Flutter ile cihaz kamerası erişimi, doğru yapılandırıldığında oldukça performanslı ve stabil çalışır. Bu rehberde, kamera donanımını başlatmaktan fotoğraf çekmeye kadar temel süreçleri inceledik. Bir sonraki adım olarak, çekilen fotoğrafları image_cropper paketi ile kırpmayı veya google_ml_kit ile görüntü üzerinde metin tanıma (OCR) işlemlerini denemenizi öneririm.
Yasal Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Uygulamanızın üretim ortamında (production) kullanacağınız güvenlik protokollerini, güncel siber güvenlik standartlarına göre (HTTPS, dosya doğrulama vb.) yapılandırmak geliştiricinin sorumluluğundadır.


Yorumlar (0)
Yorum Yaz