Android - Face Modülü¶
Face modülü, ön kamera üzerinden alınan görüntülerle kişinin gerçek bir birey olup olmadığını analiz eder. Gülümseme, göz kapama, başı sağa/sola çevirme ve yukarı bakma gibi yüz ifadelerini ve hareketlerini algılayabilir. Özellikle canlılık kontrolü gerektiren kimlik doğrulama süreçlerinde kullanılır.
⚠️ Ön Koşul: Face Modülünü kullanmadan önce Maven erişimi sağlanmış ve Core Modülü projeye eklenmiş olmalıdır.
Projeye Eklenmesi¶
1. libs.versions.toml dosyasına ekleyin:¶
wide760[versions] ... enqualify-plus = "x.x.x.x" [libraries] ... enqualify-plus-face = { group = "com.enqualify.plus", name = "face", version.ref = "enqualify-plus" }
2. build.gradle.kts dosyasına bağımlılığı ekleyin:¶
wide760implementation(libs.enqualify.plus.face)
3. Gradle Sync¶
"Sync Now" seçeneğine tıklayarak Gradle dosyalarını senkronize edin.
İmplementasyon¶
1. İzinler¶
Kamera izni SDK tarafından manifeste otomatik olarak eklenir ve gerekli noktalarda yine SDK tarafından istenir. Aşağıdaki satır yalnızca bilgi amaçlıdır:
wide760
Kamera izni verilmezse Face modülü çalışmaz.
2. Activity Layout — FrameLayout¶
Face işleminin yapılacağı Activity'nin layout'una tam ekran kaplayan bir FrameLayout eklenmelidir. SDK, kamera ekranlarını ve sayfa geçişlerini bu bileşen üzerinden yönetir:
wide760<FrameLayout android:id="@+id/fragmentContainer" android:layout_width="match_parent" android:layout_height="match_parent" />
3. FaceCallbacks Interface'inin Eklenmesi¶
FaceCallbacks interface'i Face işlemlerini yönetmek için gerekli callback metodlarını içerir ve mutlaka bir Activity ile çalışmalıdır.
Sınıfa eklenmesi:
wide760class EnQualifyPlusActivity : AppCompatActivity(), FaceCallbacks
Callback'lerin override edilmesi:
wide760class EnQualifyPlusActivity : AppCompatActivity(), FaceCallbacks { override fun initializeCompleted(modules: EnModules) { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") when (modules) { EnModules.FACE -> { // Face işlemleri başlatılabilir } } } override fun initializeFailed(failureCode: FailureCode, additionalMessage: String) { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } // Canlılık adımı callback'leri override fun faceDetected() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun smileDetected() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun eyeCloseDetected() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun eyeCloseIntervalDetected() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun faceRightDetected() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun faceLeftDetected() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun faceUpDetected() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } // Karşılaştırma callback'leri override fun faceCompareStarted() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun faceCompareCompleted() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun faceCompareFailed(errorMessage: String) { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } // Tamamlanma / hata callback'leri override fun faceSaveStarted() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun faceCompleted() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") enQualifyFace.faceCompare() // faceCompleted sonrası faceCompare başlatılır } override fun faceDetectFailed(failureCode: FaceFailureCode) { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun faceFailed(faceFailureCode: FaceFailureCode, additionalMessage: String?) { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") // LuminosityFailed iş kesici bir hata değildir; işlem durdurulmamalıdır. } override fun integrationAddCompleted() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun integrationAddFailed(errorMessage: String) { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } }
4. EnQualifyFace'nin Initialize Edilmesi¶
Face işlemlerine başlamadan önce EnQualifyFace.initialize() çağrılmalıdır. Initialize edilmeden başka bir işlem yapılmaya çalışılırsa SDK çalışmaz.
wide760val sessionModel = SessionModel( callType = "NewCustomer", reference = UUID.randomUUID().toString() ) val baseModel = BaseModel( baseURL = "https://deveqmapi.enqura.com", signallingCertificateList = listOf("enqura"), mapiCertificateList = listOf("enqura"), mobileUser = "mobile", countryCode = "TUR", locale = "TR", useEmbeddedLocalSound = false ) EnQualifyFace.initialize( context = this, fragmentManager = supportFragmentManager, containerID = R.id.fragmentContainer, sessionModel = sessionModel, baseModel = baseModel, stepCount = 3 )
Initialize Parametreleri¶
| Parametre | Tip | Açıklama |
|---|---|---|
context | Context | Uygulamanın çalışma zamanı bağlamı |
stepCount | Int | Canlılık akışında yapılacak adım sayısı |
sessionModel | SessionModel | Face işlemi sırasında kullanılacak oturum bilgileri |
baseModel | BaseModel | Doğrulama sürecinde temel verileri taşıyan model |
fragmentManager | FragmentManager | Face fragment'lerinin yönetimini sağlar |
containerID | Int | Face fragment'inin ekleneceği container'ın ID'si |
Initialize Sonrası Otomatik Akış¶
initialize() çağrıldıktan sonra SDK sırasıyla Token → Session → Settings adımlarını otomatik yürütür. Hata durumlarında ilgili callback'ler tetiklenir. Tüm adımlar başarıyla tamamlandığında initializeCompleted tetiklenir ve Face işlemleri başlatılabilir.
Face İşlemleri¶
Fonksiyonlar¶
| Fonksiyon | Varsayılan Başarı Koşulu | Açıklama |
|---|---|---|
faceDetect() | X ve Y ekseninde -15° ≤ açı ≤ 15° | Kamerada yüz tespiti — diğer adımlar için zorunlu başlangıç |
smileDetect() | Gülümseme değeri > 0.9 | Gülümseme tespiti |
eyeCloseDetect() | Göz kapalılık değeri < 0.3 | Göz kapama tespiti |
faceRightDetect() | Sağa dönüş açısı ≥ 15° | Başı sağa çevirme tespiti |
faceLeftDetect() | Sola dönüş açısı ≥ 15° | Başı sola çevirme tespiti |
faceUpDetect() | Yukarı kaldırma açısı ≥ 10° | Başı yukarı kaldırma tespiti |
faceComplete() | — | Tüm canlılık adımlarının bittiğini SDK'ya bildirir; kamera analizi durur, veriler backoffice'e gönderilir |
faceCompare() | — | Canlılık görselini OCR/NFC'den alınan biyometrik fotoğrafla karşılaştırır |
addFragment(fragment) | — | Mevcut fragment üzerine yeni fragment ekler |
replaceFragment(fragment) | — | Mevcut fragment'i yenisiyle değiştirir |
addIntegration(integrationModel) | — | Entegrasyon verisi ekler |
closeSession(isFinished: Boolean) | — | Session'ı kapatır |
clear() | — | SDK'yı temizler |
Tipik Canlılık Akışı¶
Aşağıda önerilen tipik bir canlılık akışı örneği verilmiştir. stepCount değerine ve iş akışınıza göre adımlar özelleştirilebilir:
wide760// 1. Yüz tespiti enQualifyFace.faceDetect() override fun faceDetected() { // 2. Gülümseme enQualifyFace.smileDetect() } override fun smileDetected() { // 3. Göz kapama enQualifyFace.eyeCloseDetect() } override fun eyeCloseDetected() { // Tüm adımlar tamamlandı — akışı bitir enQualifyFace.faceComplete() } override fun faceCompleted() { // Veriler backoffice'e iletildi — karşılaştırmayı başlat enQualifyFace.faceCompare() } override fun faceCompareCompleted() { // Canlılık ve karşılaştırma başarılı — sonuç sayfasına geç enQualifyFace.replaceFragment(FaceResultFragment()) }
Yüz Karşılaştırma (faceCompare)¶
faceCompare(), canlılık adımında alınan görsel ile OCR ve NFC işlemlerinden elde edilen biyometrik fotoğrafı karşılaştırarak yüz tanıma işlemi gerçekleştirir.
wide760enQualifyFace.faceCompare()
Karşılaştırma başladığında faceCompareStarted tetiklenir. Bu aşamada kullanıcıya progress göstergesi sunulması önerilir:
wide760override fun faceCompareStarted() { // Progress göster } override fun faceCompareCompleted() { // Karşılaştırma başarılı; sonuç sayfasına yönlendir } override fun faceCompareFailed(errorMessage: String) { // Karşılaştırma başarısız; hata yönetimi }
Entegrasyon Verisi Ekleme¶
wide760val integrationModel = IntegrationModel( idRegistration = IDRegistration(), addressRegistration = AddressRegistration(), data = "" ) enQualifyFace.addIntegration(integrationModel) wide760override fun integrationAddCompleted() { Log.i(TAG, "integrationAddCompleted") } override fun integrationAddFailed(errorMessage: String) { Log.i(TAG, "integrationAddFailed: $errorMessage") }
Session Kapatma ve Temizleme¶
wide760enQualifyFace.closeSession(isFinished = true) override fun sessionCloseCompleted() { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") } override fun sessionCloseFailed(errorMessage: String) { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name} $errorMessage") } // SDK'yı temizle enQualifyFace.clear()
ℹ️ Session kapatıldıktan sonra SDK'yı tekrar kullanmak için
initialize()yeniden çağrılmalıdır.
Hata Kodları¶
FaceFailureCode¶
wide760enum class FaceFailureCode(val errorMessage: String) { SmilingError("No smile detected during the capture session."), FaceDetectionError("No face detected during the capture session."), FaceUpError("No Face Up during the capture session."), FaceLeftError("No Face Left detected during the capture session."), FaceRightError("No Face Right during the capture session."), EyeCloseError("No Eye close during the capture session."), EyeOpenError("No Eye Open detected during the capture session."), FaceTimeout("FaceTimeout"), EyeCloseIntervalError("No Eye close during the capture session."), NoFaceFrameCountError("NoFaceFrameCountError"), LuminosityFailed("LuminosityFailed"), // İş kesici değildir Failed(""), FaceSaveFailed("") }
faceFailed callback'i aracılığıyla iletilir:
wide760override fun faceFailed(faceFailureCode: FaceFailureCode, additionalMessage: String?) { Log.i(tag, "${object {}.javaClass.enclosingMethod?.name}") }
⚠️ Önemli:
LuminosityFailedbir uyarı niteliğindedir ve iş kesici değildir. Bu hata geldiğinde işlem durdurulmamalıdır.
Sonuç Verisine Erişim¶
Face işlemi tamamlandıktan sonra elde edilen verilere CustomerFace nesnesi üzerinden erişilir:
wide760CustomerFace.getInstance()
CustomerFace modeli ve tüm alanlarının açıklaması için Core Modülü — CustomerFace sayfasına bakınız.
Callback Referansı¶
Token / Session / Settings¶
| Callback | Açıklama |
|---|---|
tokenCreateCompleted(isNewCreatedToken: Boolean) | Token oluşturulduğunda tetiklenir |
tokenCreateFailed(errorMessage: String) | Token oluşturma hatası |
sessionAddFailed(errorMessage: String) | Session oluşturma hatası |
settingsGetFailed(errorMessage: String) | Ayarlar alınamadığında tetiklenir |
sessionCloseCompleted(status: CallSessionTypeStatus) | Session kapatıldığında tetiklenir |
sessionCloseFailed(errorMessage: String) | Session kapatma hatası |
integrationAddCompleted() | Entegrasyon verisi başarıyla eklendi |
integrationAddFailed(errorMessage: String) | Entegrasyon verisi eklenemedi |
initializeFailed(failureCode: FailureCode, additionalMessage: String) | Core initialize hatası |
Face — Canlılık Adımları¶
| Callback | Açıklama |
|---|---|
initializeCompleted(module: EnModules) | Initialize tamamlandı, Face hazır |
faceDetected() | Yüz algılandı |
smileDetected() | Gülümseme algılandı |
eyeCloseDetected() | Göz kapama algılandı |
eyeCloseIntervalDetected() | Gözlerin belirli süre kapalı tutulduğu algılandı |
faceRightDetected() | Başı sağa çevirme algılandı |
faceLeftDetected() | Başı sola çevirme algılandı |
faceUpDetected() | Başı yukarı kaldırma algılandı |
faceSaveStarted() | Veriler backoffice'e gönderilmeye başlandı |
faceCompleted() | Veriler backoffice'e başarıyla iletildi |
faceDetectFailed(failureCode: FaceFailureCode) | Yüz algılama başarısız |
faceFailed(faceFailureCode, additionalMessage) | Face işlem hatası |
Face — Karşılaştırma¶
| Callback | Açıklama |
|---|---|
faceCompareStarted() | Karşılaştırma başladı |
faceCompareCompleted() | Karşılaştırma başarıyla tamamlandı |
faceCompareFailed(errorMessage: String) | Karşılaştırma hatası |