Integration guide for LUNA ID for Android#
This guide provides a step-by-step overview of integrating LUNA ID into an Android application.
Prerequisites#
Before you begin, make sure you have:
- Android Studio
- Android project with minimum SDK version 21 or higher
- Valid credentials for https://download.visionlabs.ru/
Step 1: Configure repository#
Add the repository to your settings.gradle.kts:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
ivy {
url = java.net.URI.create("https://download.visionlabs.ru/")
patternLayout {
artifact("releases/lunaid-[artifact]-[revision].[ext]")
setM2compatible(false)
}
credentials {
username = getLocalProperty("vl.login") as String
password = getLocalProperty("vl.pass") as String
}
metadataSources { artifact() }
}
}
}
fun getLocalProperty(key: String, file: String = "local.properties"): Any {
val file = File(rootProject.projectDir, file)
val properties = java.util.Properties()
if (file.isFile) {
InputStreamReader(FileInputStream(file), Charsets.UTF_8).use {
properties.load(it)
}
} else if (System.getenv("CI") != null) {
return "nothing"
} else {
error("File not found: '$file'")
}
return properties.getProperty(key) ?: error("Key '$key' not found")
}
Step 2: Set up credentials#
Create or edit local.properties in your project root:
vl.login=YOUR_LOGIN
vl.pass=YOUR_PASSWORD
Important: Add local.properties to your .gitignore file to keep credentials secure.
Step 3: Add dependencies#
In your app-level build.gradle.kts, add the required LUNA ID and CameraX dependencies:
dependencies {
// LUNA ID (replace {VERSION} with actual version, e.g., 1.20.0)
implementation("ai.visionlabs.lunaid:core:{VERSION}@aar")
implementation("ai.visionlabs.lunaid:common-arm:{VERSION}@aar")
implementation("ai.visionlabs.lunaid:cnn60-arm:{VERSION}@aar")
// CameraX (required)
implementation("androidx.camera:camera-core:1.3.0")
implementation("androidx.camera:camera-camera2:1.3.0")
implementation("androidx.camera:camera-lifecycle:1.3.0")
implementation("androidx.camera:camera-video:1.3.0")
implementation("androidx.camera:camera-view:1.3.0")
}
Step 4: Add permissions#
Add the following permissions to your AndroidManifest.xml:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
Step 5: Initialize LUNA ID#
Initialize the SDK in your Application class:
import android.app.Application
import ru.visionlabs.sdk.lunacore.LunaConfig
import ru.visionlabs.sdk.lunacore.LunaID
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
// Initialize with default configuration
LunaID.initEngine(
context = applicationContext,
lunaConfig = LunaConfig.create()
)
}
}
Make sure your AndroidManifest.xml references this class:
<application
android:name=".MyApp"
... >
Step 6: Launch the camera#
Before launching the camera, request permission in your Activity:
import android.Manifest
import android.content.pm.PackageManager
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
class MainActivity : AppCompatActivity() {
private val requestPermission = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted ->
if (granted) {
launchLunaCamera()
}
}
private fun checkAndRequestCameraPermission() {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED
) {
launchLunaCamera()
} else {
requestPermission.launch(Manifest.permission.CAMERA)
}
}
private fun launchLunaCamera() {
// Implementation in Step 7
}
}
In your Activity, launch the camera and handle results:
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import ru.visionlabs.sdk.lunacore.LunaID
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Wait for SDK initialization
lifecycleScope.launch {
LunaID.engineInitStatus
.filter { it is LunaID.EngineInitStatus.Success }
.first()
// Request camera permission before launching
checkAndRequestCameraPermission()
}
// Handle captured best shots
lifecycleScope.launch {
LunaID.bestShotResult
.filterNotNull()
.collect { event ->
val bestShot = event.bestShot
// Process the captured face image
// e.g., display, save, or send to server
}
}
}
private fun launchLunaCamera() {
LunaID.showCamera(this@MainActivity)
}
}
LUNA ID is now integrated and ready to use. When you run your app, the camera will automatically open and start detecting faces.