CameraX ve ML Kit ile Android'de Barkod/QR Kod Okuma

Herkese merhaba, bu yazıda sizlere Android Jetpack kütüphanelerinden olan CameraX ve Google ML Kit içinde yer alan Barcode Scanning kütüphanelerini kullanarak nasıl Barkod/QR kod okuma işlemi yapılacağını anlatacağım.



ML Kit, Google'ın mobil uygulama geliştiricilere sunduğu, içerisinde makine öğrenmesi için çeşitli API'leri bulunduran gelişmiş bir SDK’dır. ML Kit, makine öğrenmesi işlemlerinin cihaz üzerinde gerçekleşmesi için gerekli optimizasyonlara sahiptir. Bu da, işlemlerin hem daha hızlı olmasını sağlar hem de çevrimdışı olarak da bu özellikleri kullanmaya imkan sağlar. Android Jetpack ise, geliştiricilerin Android işletim sistemi için daha modern yaklaşımlarla uygulamalar geliştirmesini sağlayan bir kütüphane paketidir. Android Jetpack içerisinde geçmişte karşılaşılan birçok problem için optimize çözümleri barındırır. Bu sayede geliştiriciler, geçmişte yaşadıkları problemlere odaklanmak yerine artık daha üretken olmaya odaklanabilirler.


Kısa bir giriş yaptıktan sonra, artık konumuzun teknik detaylarına geçebiliriz. Bu yazıda odak noktası CameraX ve Barcode Scanning kütüphaneleri olacağı için diğer detaylara çok fazla girmeyeceğim.

Kurulum


Kütüphanelerin entegrasyonu için ilk adım olarak proje düzeyindeki project/build.gradle dosyasında, buildscript ve allprojects kapsamlarına Google Maven reposunu eklediğimizden emin olmanız gerekiyor.


Uygulama düzeyindeki app/build.gradle dosyasına aşağıdaki kütüphaneleri ekliyoruz.



Bu işlemden sonra, kamera kullanımı için gerekli olan birkaç düzenlemeyi yapıyoruz. Kamera kullanımında kullanıcıdan izin almak gerektiği için bu izni AndroidManifest.xml dosyasına eklememiz gerekiyor. Ek olarak Android.hardware.camera.any özelliğinin eklenmesi, cihazın bir kamerası olmasını garanti eder.


<uses-feature android:name="android.hardware.camera.any" />
<uses-permission android:name="android.permission.CAMERA" />


UI İşlemleri


Basit özelliklere sahip bir Barcode/QR kod okuma ekranı için örnek projemizde aşağıdaki gibi bir ekran tasarımı oluşturduk. Bu ekran tasarımı içerisinde, CameraX içerisinde bulunan PreviewView elementi yer alıyor. Bu element, kamera ön izlemesi için gereklidir. Ek olarak, barkodu ya da QR kodunu kamera üzerinde daha iyi yakalayabilmek için View sınıfından türettiğimiz bir ViewFinderOverlay elementimiz var.



Şimdi sıra geldi QR kod okuma işlemi yapmak için BarcodeScanningActivity sınıfını oluşturmaya. Tek bir Activity'den oluşan bir örnek uygulama geliştirdiğim için, bu Activity hem uygulamanın açılış ekranı hem de Barkod/QR kod okuma işleminin yapıldığı ekran olarak yer alıyor. Bu ekran açılır açılmaz, kullanıcının daha önceden kameraya erişim izni verip vermediğini kontrol ediyor. Eğer kamera erişim izni verilmemişse, bu izin için uyarı çıkarıyor. Eğer kamera izni verilmişse, Barkod/QR kod okumak için kamerayı başlatıyor.


Yukarıda bahsettiğim kamera izni senaryosunun tamamlandığını kabul ederek, kamera önizlemesi için gerekli konfigürasyonları yapıyoruz.



ProcessCameraProvider nesnesi ile kamera yaşam döngüsünü, mevcut yaşam döngüsüne bağlıyoruz. Bu sayede kamerayı açıp kapatma işlemlerini kontrol etmemize gerek kalmıyor.


Sonrasında bir adet Executor oluşturuyoruz. Ardından da ProcessCameraProvider nesnemiz için bir adet listener oluşturuyoruz. Bu listener ile kamera önizlemesini aktif hale getireceğiz.


Bu arada View sınıfından türettiğimiz ViewFinderOverlay nesnemizi de kamera ön izlemesi üzerinde aktif hale getiriyoruz. Yani kamera ön izlemesi üzerinde görünen, kare kodun yerleştirileceği alanı ekliyoruz.


Sırada, kamera ön izlemesini aktif etme ve Barkod/QR kod için analiz işlemleri için gerekli ayarlamaları yapmak var.



Bir adet Preview nesnesi oluşturduk. Ardından CameraSelector ile kullanmak istediğimiz kamerayı belirledik. Ben arka kamerayı seçtim. ImageAnalysis nesnemizi oluşturup, hedef çözünürlük gibi düzenlemeleri buradan ayarlayabiliyoruz. OrientationEventListener ile de kamera oryantasyonları değişse bile bundan etkilenmemesi için gerekli düzenlemeleri yapıyoruz.


Şimdi sırada QR kod analizi için gerekli olan kısım var. Burada; daha önce oluşturduğumuz ImageAnalysis nesnemize, analiz işleminin yapılacağı sınıfı parametre olarak geçiyoruz. Burada, oluşturduğumuz MLKitBarcodeAnalyzer sınıfını kullanacağız. Bu sınıfın detaylarına birazdan göz atacağız.


Arada basit bir ScanningResultListener arayüzü kullandık. Bu işlem tamamen MLKitBarcodeAnalyzer sınıfında dönecek sonucu UI'da dinleyebilmek için kullandığımız bir interface olacak. Bu örnek projede View Model kullanmadığım için LiveData ile bunu yapmak istemedim. İsterseniz o şekilde de kullanabilirsiniz.


Son olarak kullanılan cihaz flash modunu destekliyorsa, flash modu ile ilgili ayarlamaları da bu sırada yaptık.


Tüm bu işlemlerden sonra kameramızın yaşam döngüsünü, mevcut yaşam döngüsüyle ilişkilendirdik. CameraX ile artık lifecycle aware yani yaşam döngüsüne duyarlı bir kameramız mevcut. Bu sayede birçok bellek sorunları ve kontrollerden kurtulmuş oluyoruz.


Şimdi gelelim QR kodun analizinin yapılıp, sonucunun döndürüldüğü MLKitBarcodeAnalyzer sınıfına.



Bu sınıf CameraX içinde bulunan ImageAnalysis.Analyzer sınıfının bir alt sınıfı. İçerisinde kamera ön izlemesinde yakalanan her frame'i analiz edebiliyorsunuz. Yakalanan her bir frame'i de ML Kit Vision API içinde bulunan InputImage ile tarama yapmak için gerekli olan imaj nesnesine dönüştürebiliyorsunuz.


Bu sınıf içerisinde, ML Kit BarcodeScanning sınıfının bir nesnesini kullandık. Ardından yakalan frame'den türetilen imaj nesnesini analiz işlemine sokuyoruz. Eğer analiz işlemi başarılı bir şekilde tamamlanırsa, bize RawValue olarak sonucu dönüyor.


Sürekli devam eden bir kod okuma işlemi olmaması için bir adet Boolean değerle kontrol yaptım. Ek olarak; okumak istediğiniz kod tiplerini özelleştirmek isterseniz, aşağıdaki gibi BarcodeScannerOptions nesnesi ile bunu yapabilirsiniz.


val options = BarcodeScannerOptions.Builder()
    .setBarcodeFormats(
        Barcode.FORMAT_QR_CODE,
        Barcode.FORMAT_CODE_39
    ).build()
val scanner = BarcodeScanning.getClient(options)

Genel olarak implementasyon işlemleri bu şekilde. Kodun tam haline de yazının sonunda paylaştığım Github reposundan erişebilirsiniz. Aşağıda da örnek uygulamadan bir adet ekran görüntüsünü görebilirsiniz.



Google ML Kit Barcode Scanning ve Jetpack CameraX sayesinde, özellikle Android dünyasında uzun yıllardır sürekli alternatif çözümlerle ilerleyen Barkod/QR kod okuma işlemleri artık çok daha kolay hale geldi.


Herhangi bir sorunuz olması durumunda yorum olarak ekleyebilirsiniz. Okuduğunuz için çok teşekkürler, umarım faydalı bir yazı olmuştur.


Tekrar görüşmek dileğiyle.


Github: https://github.com/iamvolkanhotur/QRScanningWithMLKit


Kaynaklar:

https://developers.google.com/ml-kit/vision/barcode-scanning

https://developer.android.com/training/camerax

https://codelabs.developers.google.com/codelabs/camerax-getting-started#3


#android #kotlin #jetpack #camerax #mlkit #barcode #qrcode

0 yorum

Son Paylaşımlar

Hepsini Gör

Komünite

Platform

Mobiler.dev Anasayfa
  • Twitter
  • Instagram
  • development_düzenlendi_düzenlendi
  • Youtube
  • slack-icon-black_edited_edited_edited
  • Gri LinkedIn Simge
imageedit_2_9667998092.png
JetBrains Hakkında Detaylı Bilgi Alın

© 2021 by mobiler.dev

Kurumsal Yazar Hesapları

adesso.png
mobilerdevLogo.jpg
Yazarlık Başvurusu Hakkında Bilgi Alın, Başvuru Yapın.
Topluluk Yazarlarını Tanıyın